keybd_event(VK_CONTROL, (BYTE) 0 , 0 , 0 ); keybd_event( ' A ' ,(BYTE) 0 , 0 , 0 ); // 此处可以用 'A', (BYTE)65, 用'a'不起作用. keybd_event( ' A ' , (BYTE) 0 , KEYEVENTF_KEYUP, 0 ); keybd_event(VK_CONTROL, (BYTE) 0 , KEYEVENTF_KEYUP, 0 );
keybd_event(VK_CONTROL, 0 , 0 , 0 ); keybd_event(VK_MENU, 0 , 0 , 0 ); keybd_event(VK_DELETE, 0 , 0 , 0 ); keybd_event(VK_CONTROL, 0 , KEYEVENTF_KEYUP , 0 ); keybd_event(VK_MENU, 0 , KEYEVENTF_KEYUP , 0 ); keybd_event(VK_DELETE, 0 , KEYEVENTF_KEYUP , 0 );
模拟键盘平时不是很常用, 但是当调用某些快捷键执行某项功能时, 它真的是那么的方便呀. 你不信? 看看下面的实现, 你就会大呼: 为什么不早点告诉我? 呵呵, 原来没有blog呀, 都靠这些挣分呢.1) 显示桌面:很多软件有显示桌面的功能, 并且大家的方法都是遍历窗口, 然后让它们最小化, 其实 win系统给咱们了一个非常方便的WIN键(就是键盘上在CTRL键和ALT键之间的那个带win标志的按键), 利用它, 可以轻松的完成显示桌面的功能.keybd_event(VK_LWIN, 0, 0 ,0);keybd_event('M', 0, 0 ,0);keybd_event('M', 0, KEYEVENTF_KEYUP ,0);keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);其他的操作也类似, 比如直接显示开始的运行,就把上面的'M'换成'R'即可。直接 keybd_event(VK_LWIN, 0, 0 ,0);keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);直接显示“开始”对话框了。2) 实现快速的全选很多的时候,比如listctrl实现全选,你可以用listctrl循环设置每一项的状态为选中,多罗索的事情呀。用快捷键试一试CTRL+A,其他的快捷键一样的用法,呵呵,你知道怎么办了吧?keybd_event(VK_CONTROL, (BYTE)0, 0 ,0);keybd_event('A',(BYTE)0, 0 ,0); //此处可以用 'A', (BYTE)65, 用'a'不起作用.keybd_event('A', (BYTE)0, KEYEVENTF_KEYUP,0);keybd_event(VK_CONTROL, (BYTE)0, KEYEVENTF_KEYUP,0);3) 执行某些特殊的键,比如数字键,大小写,下面是数字键的例子bool bState=true; //true为按下NumLock,false反之BYTE keyState[256];GetKeyboardState((LPBYTE)&keyState);if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||(!bState && (keyState[VK_NUMLOCK] & 1)) ){// Simulate a key presskeybd_event( VK_NUMLOCK,0x45,KEYEVENTF_EXTENDEDKEY | 0,0 );// Simulate a key releasekeybd_event( VK_NUMLOCK,0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);}4) 你想CTRL+ALT+DELETE三键一起按下,keybd_event(VK_CONTROL, 0, 0 ,0);keybd_event(VK_MENU,0, 0 ,0);keybd_event(VK_DELETE,0, 0 ,0);keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);呵呵,这样不会成功呀,因为这几个键直接是操作系统来截获执行的,而模拟键盘只能发向应用程序,所以这种方法不行的(想显示锁定对话框,用 LockWorkStation();)5) Window2000/NT/XP已经不提倡用这个函数了,上面的方法只是为了让大家开阔一下思路,怎么替代呢,呵呵,看下面,所以上面的所有代码都可以用这个来完成//2000下用这个代替 ,包含 "winable.h"INPUT input[4];memset(input, 0, sizeof(input));input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;input[0].ki.wVk = input[3].ki.wVk = VK_LWIN;input[1].ki.wVk = input[2].ki.wVk = 'R';//接下来释放它,这一点很重要。input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;input[0].ki.time = input[1].ki.time = input[2].ki.time = input[3].ki.time = GetTickCount();SendInput(4, input, sizeof(INPUT));感觉比那个有点罗索,呵呵。====================附WIN键的部分快捷键:WIN键+D=快速的切到桌面,再次点击返回WIN键+E=快速打开资源管理器WIN键+R=“运行”。WIN键+M=全部视窗最小化。WIN键+Shift+M=取消全部视窗最小化。WIN键+F1=Help。WIN键+F=“寻找”。WIN键+Ctrl+F=显示“查找电脑”。WIN键+Tab=切换工作列的程式。 WIN键+Break=显示系统内容。
keybd_event(VK_CONTROL, 0 , 0 , 0 ); keybd_event( & apos;V & apos;, 0 , 0 , 0 ); keybd_event(VK_CONTROL, 0 ,KEYEVENTF_KEYUP, 0 );keybd_event( & apos;V & apos;, 0 ,KEYEVENTF_KEYUP, 0 );
void CSimulationDlg::OnBtncheckparam()
{
// TODO: Add your control notification handler code here
//获得当前进程的快照
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ((HANDLE)-1 == hSnapshot)
{
return;
}
//进程信息
PROCESSENTRY32 ProcessInfo;
ProcessInfo.dwSize = sizeof(PROCESSENTRY32);
//获得快照中第一个进程
BOOL bResult = Process32First(hSnapshot, &ProcessInfo);
if (!bResult)
{
return;
}
while (bResult)
{
//进程的可执行文件名
if(CString(ProcessInfo.szExeFile)==m_filename)
{
//MessageBox("程序正在运行!");
//利用进程的ID值,打开该进程,获得进程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE,ProcessInfo.th32ProcessID);
HWND m_hwnd=(HWND)hProcess;
if(m_hwnd)
{
::PostMessagem_hwnd, WM_KEYDOWN, VK_SPACE,0);
::PostMessage(m_hwnd,WM_KEYUP, VK_SPACE,0); //释放
}
break;
}
else
{
//获得快照中下一个进程
bResult = Process32Next(hSnapshot, &ProcessInfo);
}
}
if (!bResult)
{
MessageBox("程序没有运行!");
}
//关闭快照
CloseHandle(hSnapshot);
}