如何在C++中制作打字宏

How do you make a typing macro in C++

本文关键字:C++      更新时间:2023-10-16

我正在尝试制作一个程序,当您键入"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的返回值,高位字节包含 Shift 状态,控制大写字母,然后确定是否发送 Shift 键。
相关文章:
  • 没有找到相关文章