我正在创建一个个人项目,以帮助我使用自定义GUI按键。为了做到这一点,我有一个DearImGui框架运行在一个外部窗口作为一个独立的应用程序。
当我按下按钮时,应用程序为keybind中的每个键模拟按键。但是,在发送控制键、shift键和alt键时似乎有一个问题。我已经为此挣扎了一天多了,直到现在才意识到这个问题可能是Windows内部的安全措施。我相信Windows阻止我模拟控制键,shift键和alt键的按键,以防止恶意软件可能假装是人类。
我决定包括非常简约的例子,因为我相信问题源于windows,而不是我的编程错误。
这个例子成功按下F8:
if (ImGui::Button("Button 1", ImVec2(334, 30)))
{
keybd_event(0x77, 0, 0, 0); //Press down the Key
keybd_event(0x77, 0, KEYEVENTF_KEYUP, 0); //Release the Key
}
虽然这个应该发送组合CTRL + F1,但只注册F1:
if (ImGui::Button("Button 2", ImVec2(334, 30)))
{
keybd_event(0x70, 0, 0, 0); //Press down the Key
keybd_event(VK_CONTROL, 0, 0, 0); //Press down the Key
keybd_event(0x70, 0, KEYEVENTF_KEYUP, 0); //Release the Key
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); //Release the Key
}
注意:所有其他键似乎都工作得很好,我也试过只发送一个ctrl键,看看这是否是一个"你一次只能做一个"。问题(不是)
你正在按下键钥匙的顺序不对。你需要"按"一下。按下Ctrl键,然后按F1键。
if (ImGui::Button("Button 2", ImVec2(334, 30)))
{
keybd_event(VK_CONTROL, 0, 0, 0); //Press down the Key
keybd_event(VK_F1, 0, 0, 0); //Press down the Key
keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0); //Release the Key
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); //Release the Key
}
话虽如此,keybd_event()
已被弃用,请使用SendInput()
代替,例如:
if (ImGui::Button("Button 2", ImVec2(334, 30)))
{
INPUT ips[4] = {};
ips[0].type = INPUT_KEYBOARD;
ips[0].ki.wVk = VK_CONTROL;
ips[1] = ip[0];
ips[1].ki.wVk = VK_F1;
ips[2] = ip[1];
ips[2].ki.dwFlags = KEYEVENTF_KEYUP;
ips[3] = ips[0];
ips[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, ips, sizeof(INPUT));
}