如何模拟一直按住CTRL键呢? 我现在想做一个程序,就是一直按住CTRL键,程序结束时ctrl再弹起,否则就一直处于按住状态。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void SendKeyDown(BYTE VKey, WORD NumTimes, bool GenUpMsg, bool bDelay){ WORD Cnt = 0; BYTE ScanCode = 0; bool NumState = false; if (VKey == VK_NUMLOCK) { DWORD dwVersion = ::GetVersion(); for (Cnt=1; Cnt<=NumTimes; Cnt++) { if (bDelay) CarryDelay(); // snippet based on: // http://www.codeproject.com/cpp/togglekeys.asp if (dwVersion < 0x80000000) { ::keybd_event(VKey, 0x45, KEYEVENTF_EXTENDEDKEY, 0); ::keybd_event(VKey, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } else { // Win98 and later if ( ((DWORD)(HIBYTE(LOWORD(dwVersion))) >= 10) ) { // Define _WIN32_WINNT > 0x0400 // to compile INPUT input[2] = {0}; input[0].type = input[1].type = INPUT_KEYBOARD; input[0].ki.wVk = input[1].ki.wVk = VKey; input[1].ki.dwFlags = KEYEVENTF_KEYUP; ::SendInput(sizeof(input) / sizeof(INPUT), input, sizeof(INPUT)); } // Win95 else { KEYBOARDSTATE_t KeyboardState; NumState = GetKeyState(VK_NUMLOCK) & 1 ? true : false; GetKeyboardState(&KeyboardState[0]); if (NumState) KeyboardState[VK_NUMLOCK] &= ~1; else KeyboardState[VK_NUMLOCK] |= 1; SetKeyboardState(&KeyboardState[0]); } } } return; } // Get scancode ScanCode = LOBYTE(::MapVirtualKey(VKey, 0)); // Send keys for (Cnt=1; Cnt<=NumTimes; Cnt++) { // Carry needed delay ? if (bDelay) CarryDelay(); KeyboardEvent(VKey, ScanCode, IsVkExtended(VKey) ? KEYEVENTF_EXTENDEDKEY : 0); if (GenUpMsg) KeyboardEvent(VKey, ScanCode, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP); }}//调用SendKeyDown(VK_CONTROL, 1, false); 按住键盘的时候应该一直不停的发送按键消息,但是例如一直按住shift建1秒钟会产生如下消息消息 虚拟键代码 先前状态WM_KEYDOWN VK_SHIFT 0WM_KEYDOWN VK_SHIFT 1WM_KEYDOWN VK_SHIFT 1WM_KEYDOWN VK_SHIFT 1WM_KEYDOWN VK_SHIFT 1WM_KEYDOWN VK_SHIFT 1。。WM_KEYUP VK_SHIFT 1 Worksheets.Add()运行出错 如何设置窗体打开后在屏幕某个位置?急 在线等 初学者的问题:windows API、COM、MFC三者区别和关系? 关于UDP文件传输(断点续传),送多分 求助(怎么把一个程序加入到windows的服务中去) 怎么让鼠标由箭头变手指时不会跳动? 100分 请高手帮忙编个小程序 !!!急啊 sql 如何通过代理服务器取页面代码 如何改变ListBox控件中每一行的颜色? 控件库的下载 多进程编程与多线程编程的区别
void SendKeyDown(BYTE VKey, WORD NumTimes, bool GenUpMsg, bool bDelay)
{
WORD Cnt = 0;
BYTE ScanCode = 0;
bool NumState = false; if (VKey == VK_NUMLOCK)
{
DWORD dwVersion = ::GetVersion(); for (Cnt=1; Cnt<=NumTimes; Cnt++)
{
if (bDelay)
CarryDelay();
// snippet based on:
// http://www.codeproject.com/cpp/togglekeys.asp
if (dwVersion < 0x80000000)
{
::keybd_event(VKey, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
::keybd_event(VKey, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
else
{
// Win98 and later
if ( ((DWORD)(HIBYTE(LOWORD(dwVersion))) >= 10) )
{
// Define _WIN32_WINNT > 0x0400
// to compile
INPUT input[2] = {0};
input[0].type = input[1].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[1].ki.wVk = VKey;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
::SendInput(sizeof(input) / sizeof(INPUT), input, sizeof(INPUT));
}
// Win95
else
{
KEYBOARDSTATE_t KeyboardState;
NumState = GetKeyState(VK_NUMLOCK) & 1 ? true : false;
GetKeyboardState(&KeyboardState[0]);
if (NumState)
KeyboardState[VK_NUMLOCK] &= ~1;
else
KeyboardState[VK_NUMLOCK] |= 1; SetKeyboardState(&KeyboardState[0]);
}
}
}
return;
} // Get scancode
ScanCode = LOBYTE(::MapVirtualKey(VKey, 0)); // Send keys
for (Cnt=1; Cnt<=NumTimes; Cnt++)
{
// Carry needed delay ?
if (bDelay)
CarryDelay(); KeyboardEvent(VKey, ScanCode, IsVkExtended(VKey) ? KEYEVENTF_EXTENDEDKEY : 0);
if (GenUpMsg)
KeyboardEvent(VKey, ScanCode, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP);
}
}//调用
SendKeyDown(VK_CONTROL, 1, false);
例如一直按住shift建1秒钟会产生如下消息
消息 虚拟键代码 先前状态
WM_KEYDOWN VK_SHIFT 0
WM_KEYDOWN VK_SHIFT 1
WM_KEYDOWN VK_SHIFT 1
WM_KEYDOWN VK_SHIFT 1
WM_KEYDOWN VK_SHIFT 1
WM_KEYDOWN VK_SHIFT 1
。。
WM_KEYUP VK_SHIFT 1