繁体   English   中英

你如何在 C++ 中创建一个打字宏

[英]How do you make a typing macro in C++

我正在尝试制作一个程序,当您键入“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”)时,它也会输入该字母。 有什么办法可以取消那个按键吗? 我想我可以让它在单词之前输入退格按钮,但我假设有更好的方法来解决这个问题。
  • 我还有一个问题,程序没有准确输入输入的内容。它没有输入大写字母,如果连续有两个字母,它只输入一个字母。 在我放置的代码中,它会说“helo”而不是“Hello”。

我对你的代码做了一些简单的修改,基本可以满足你的需求。 但是如果您需要更高的功能,您可能需要使用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的返回值,高位字节包含移位状态,控制大写字母,然后确定是否发送移位键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM