Как сделать макрос для ввода в C ++ - PullRequest
0 голосов
/ 23 декабря 2019

Я пытаюсь создать программу, которая, когда вы наберете «Alt + A», напишет строку наподобие «Hello», например. Это самое близкое, что я получил:

if (GetAsyncKeyState(65))
{

    cout << "worked" << std::endl;  
    string bind = "Hello";

    INPUT Input = { 0 };
    Input.type = INPUT_KEYBOARD;

    for (int i = 0; i < bind.length(); i++)
    {

        Input.ki.wVk = VkKeyScanA(bind[i]);
        SendInput(1, &Input, sizeof(Input));
    }
    Sleep(500);
}

Это работает так же, как я хочу, но есть некоторые проблемы, с которыми я столкнулся:

  • Я не могу получитьAlt ключ к работе. Когда я использую GetAsyncKeyState (18), он запускает «обработанный» вывод, но не вводит слово.
  • Всякий раз, когда я нажимаю связку клавиш (например, «A»), он набираетэто письмо тоже. Можно ли как-то отменить это нажатие клавиши? Я думал, что мог бы просто сделать так, чтобы он набирал кнопку возврата на шаг перед словом, но я предполагаю, что лучше это сделать.
  • У меня также есть проблема, что программа не 't введите именно то, что вставлено. Он не печатает заглавные буквы, а набирает только одну букву, если их две в строке. В коде, который я вставил, вместо «Hello» будет написано «helo».

1 Ответ

0 голосов
/ 24 декабря 2019

Я сделал несколько простых изменений в вашем коде, которые в основном могут удовлетворить ваши потребности. Но если вам нужна более высокая функциональность, вам может потребоваться использовать RegisterHotKey и создать окно для обработки сообщения WM_HOTKEY.

#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
    HWND hwnd = (HWND)0x001E0BF2; //notepad window
    SetForegroundWindow(hwnd);
    while (1)
    {
        if (GetAsyncKeyState(18)&0x8000)
        {
            if (GetAsyncKeyState(65)&0x8000)
            {
                INPUT keyup_ALT = { 0 };
                keyup_ALT.type = INPUT_KEYBOARD;
                keyup_ALT.ki.wVk = 18;
                keyup_ALT.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &keyup_ALT, sizeof(INPUT));

                cout << "worked" << std::endl;
                string bind = "Hello";

                INPUT Input[2] = { 0 };
                Input[0].type = Input[1].type = INPUT_KEYBOARD;
                Input[1].ki.dwFlags = KEYEVENTF_KEYUP;
                for (int i = 0; i < bind.length(); i++)
                {
                    short ch = VkKeyScanA(bind[i]);
                    Input[0].ki.wVk = Input[1].ki.wVk = ch;
                    if (((ch & 0xff00) >> 8) & 0x1)
                    {
                        INPUT shift = { 0 };
                        shift.type = INPUT_KEYBOARD;
                        shift.ki.wVk = VK_SHIFT;
                        SendInput(1, &shift, sizeof(INPUT));
                    }
                    SendInput(2, Input, sizeof(INPUT));
                    if (((ch & 0xff00) >> 8) & 0x1)
                    {
                        INPUT shift = { 0 };
                        shift.type = INPUT_KEYBOARD;
                        shift.ki.wVk = VK_SHIFT;
                        shift.ki.dwFlags = KEYEVENTF_KEYUP;
                        SendInput(1, &shift, sizeof(INPUT));
                    }
                }
                Sleep(500);
            }

        }
    }
}

ИЗМЕНЕНИЯ:

  1. Добавить проверку состояния клавиши ALT;
  2. Сделать возвращаемое значение GetAsyncKeyState и (&) 0x8000;
  3. Нажмите клавишу ALT, чтобы разрешить "он запускает" обработанный "вывод, но не набирает ни одного слова."
  4. Проверьте возвращаемое значение VkKeyScanA, старший байт содержит состояние сдвига, которые управляют заглавными буквами, а затем определяют, следует ли отправлять клавишу сдвига.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...