我正在为各种模拟器制作前端,并触发它们的各种功能,例如保存/加载状态、保存截图,但使用统一界面。FS-UAE令人讨厌地使用“Print Screen”作为其截图键,我想避免用户更改模拟器的默认热键设置。
我已经成功地使用SendInput模拟了我想要的任何按键,除了“Print Screen”键。
我尝试过使用虚拟键代码,但没有成功,我认为这在全屏应用程序中无法工作。因此,该部分代码被注释掉了。(编辑:更好的解释-直接输入软件会忽略虚拟键代码)
使用扫描码,我可以按下任何键-几乎任何键。Print Screen似乎是个例外。
这是我用于扫描码的参考资料: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx 以下是最小可行代码,以重现问题。如果你运行它,按下一个键然后迅速切换到记事本并等待2秒钟,它应该在记事本中按下字母“q”,然后退出。
我已经成功地使用SendInput模拟了我想要的任何按键,除了“Print Screen”键。
我尝试过使用虚拟键代码,但没有成功,我认为这在全屏应用程序中无法工作。因此,该部分代码被注释掉了。(编辑:更好的解释-直接输入软件会忽略虚拟键代码)
使用扫描码,我可以按下任何键-几乎任何键。Print Screen似乎是个例外。
这是我用于扫描码的参考资料: https://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx 以下是最小可行代码,以重现问题。如果你运行它,按下一个键然后迅速切换到记事本并等待2秒钟,它应该在记事本中按下字母“q”,然后退出。
将扫描码从0x10(q)更改为0x37(Print Screen),确保在KEY DOWN和KEY UP两个位置都进行更改。
现在再次运行它,按下一个键并等待。要查看Print Screen是否起作用,请打开MS Paint或其他应用程序,然后按CTRL + V,看看是否获得了桌面的截图。但是它不起作用!但是,如果您手动按Print Screen,然后按CTRL + V进入MS Paint,则可以正常工作。
为什么Print Screen键无法正常工作?
#include "stdafx.h"
//For create process & keyboard codes
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int main()
{
INPUT ip = {};
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.wVk = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.dwFlags = 0;
printf("Press a key, then taskswitch.\n");
system("pause");
Sleep(2000);
//KEY DOWN
ip.ki.wScan = 0x10; //0x37 PrintScreen, 0x10 Q
ip.ki.dwFlags = KEYEVENTF_SCANCODE;
//ip.ki.wVk = VK_SNAPSHOT;
//ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
//KEY UP
ip.ki.wScan = 0x10;
ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
//ip.ki.wVk = VK_SNAPSHOT;
//ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
printf("Done.\n");
system("pause");
return 0;
}
SendInput
而非进行单次调用并传入数组。 - zett42VK_SNAPSHOT
is0x2C
, not0x37
- Barmak Shemirani