【问题标题】:How do you make a typing macro in C++如何在 C++ 中制作打字宏
【发布时间】:2019-12-27 09:33:19
【问题描述】:

我正在尝试编写一个程序,当您键入“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”。

【问题讨论】:

  • 只是一个快速的术语问题,标题中的“macro”一词让我大吃一惊。对于一些 C++ 开发人员来说,这意味着一些非常不同的东西:)
  • 我在查找如何制作这个时看到了这一点。我应该改变措辞吗?而是键入 Bot 或 Script?
  • 另外,您似乎正在使用std 命名空间,这可以lead to problems。抱歉,我正在回答您没有提出的所有问题,而不是您所提出的问题;)
  • 我不会改变措辞,只是要注意一些事情!
  • 我用于SendInput的教程使用了它。我通常不带它。

标签: c++ windows winapi


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2019-11-14
  • 2011-10-17
  • 2023-03-13
  • 2018-02-07
相关资源
最近更新 更多