使用SendInput模拟按键,代码如下:
#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#define KEY_TO_FIRE VK_RWIN
int _tmain(int argc, _TCHAR* argv[])
{
_tprintf(_T("fire key...
"));
INPUT keyEvent = {0};
keyEvent.type = INPUT_KEYBOARD;
keyEvent.ki.wVk = KEY_TO_FIRE;
keyEvent.ki.wScan = MapVirtualKey(KEY_TO_FIRE, 0);
keyEvent.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
if( 0 == SendInput(1, &keyEvent, sizeof(keyEvent)) )
{
_tprintf(_T("SendInput error: %u
"), GetLastError());
}
keyEvent.ki.dwFlags |= KEYEVENTF_KEYUP;
if( 0 == SendInput(1, &keyEvent, sizeof(keyEvent)) )
{
_tprintf(_T("SendInput (UP) error: %u
"), GetLastError());
}
_tprintf(_T("wait 3s to fire again...
"));
Sleep(3000);
keyEvent.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
if( 0 == SendInput(1, &keyEvent, sizeof(keyEvent)) )
{
_tprintf(_T("SendInput error: %u
"), GetLastError());
}
keyEvent.ki.dwFlags |= KEYEVENTF_KEYUP;
if( 0 == SendInput(1, &keyEvent, sizeof(keyEvent)) )
{
_tprintf(_T("SendInput (UP) error: %u
"), GetLastError());
}
_getch();
return 0;
}
发现Windows按键(VK_LWIN和VK_RWIN)死活出不来,查半天发现是360安全卫士的问题。它的驱动防护拦截了这个按键发送调用。
关闭驱动防护即可,如图中标注所示:
或者加入信任列表:
360管真心管得宽……