VC如何模拟按键并释放? 模拟按键:
利用PostMessage函数发送按键消息.
HWND hWnd;
hWnd = ::FindWindow(NULL, "指定的窗口标题");//得到目标窗口句柄
if ( hWnd == NULL )
{
AfxMessageBox("没有找到目标程序");
}
else
{
::PostMessage(hWnd, WM_KEYDOWN, VK_F1, 1);
::PostMessage(hWnd,WM_KEYUP, VK_F1, 1); //释放
}
或者:
HWND hWnd;
hWnd = ::FindWindow(NULL, "计算器");//找到目标窗口的hWnd
if ( hWnd != NULL )
{
::PostMessage(hWnd, WM_KEYDOWN, VK_F1, 1);
::PostMessage(hWnd,WM_KEYUP, VK_F1, 1); //释放
}
求一个用vc写的发送按键消息的例程
悬赏分:200 - 解决时间:2008-9-27 13:39
比如向 最小化 的记事本打一个“a”进去。
看清楚哦,要那种最小化也可以的哦。
我要完整的代码,要直接复制到vc6.0里就能运行的。
对高手来说应该不难吧~~~~谢咯
问题补充:
鄙视粘贴复制流~~~~~
谢三楼哈~~~~~~~你能稍微解释一下吗??
为什么要加一句HWND hWndc = ::GetWindow(hWnd,GW_CHILD);
我小菜,不太懂~~~最佳答案
检举
#include <windows.h>
void main()
{
HWND hWnd = ::FindWindowW(L"Notepad",NULL); //搜索记事本程序主窗口句柄
HWND hWndc = ::GetWindow(hWnd,GW_CHILD); //获得记事本客户区句柄(该窗口是记事本主窗口的子窗口,即那个白色的可编辑区域)
if(hWndc) //如果获得了该句柄
::SendMessage(hWndc,WM_CHAR,'A',NULL);//发送按键消息
}
这个例子就是实现向 最小化 的记事本打一个“A”进去。别的字符把最后一行单引号里面的A换掉就行了。
如果你用mfc生成过基于doc/view的程序就明白为什么有这一句了。hWnd相当于主框架窗口,hWndc相当于视图窗口
vc发送按键的两种方法:
1.SendMessage or PostMessage
2.keybd_event,mouse_event
前者更强大,指定hwnd后可以后台发送,而后者只能够发送前台信息..也就是必须窗口最前
简单的举例:
方法2
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
keybd_event(k,0,0,0);
keybd_event(k,0,KEYEVENTF_KEYUP,0);
方法1
以当前程序的某个输入框为例:
HWND tw2 = GetDlgItem(IDC_EDIT1)->m_hWnd;
::SendMessage(tw2,WM_CHAR,s[i],0);
否个按钮:
HWND tw3 = GetDlgItem(IDOK)->m_hWnd;
::SendMessage(tw3,WM_LBUTTONDOWN,0,0);
::SendMessage(tw3,WM_LBUTTONUP,0,0);
以记事本为例
wnd = ::FindWindow("notepad", NULL);
wnd = FindWindowEx(wnd,0,"Edit",NULL);
::SendMessage(tw2,WM_CHAR,s[i],0);
有人就说了,我不知道名字叫Edit啊,有下面的方法:
CWnd * pwnd = FindWindow("notepad", NULL);
CWnd * p2 = pwnd->GetTopWindow();
wnd = p2->m_hWnd;
::SendMessage(tw2,WM_CHAR,s[i],0);
又有人说了,如果连notepad也不知道呢...
我说,进程ID总知道了吧...遍历进程池得到想要的进程ID,然后找到指定ID的hwnd
struct EnumParam
{
HWND hMainWnd;
DWORD dwProcessID;
};
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;
EnumParam* pep = (EnumParam*)lParam;
GetWindowThreadProcessId(hwnd,&dwID);
if (dwID == pep->dwProcessID) {
pep->hMainWnd = hwnd;
return 0;
}
return TRUE;
}
EnumParam ep;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ep.hMainWnd = NULL;
memset(&si, 0, sizeof(si));
si.cb = sizeof(STARTUPINFO);
if (CreateProcess(NULL,"notepad.exe c:\1.txt",
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
ep.dwProcessID = pi.dwProcessId;
while(!ep.hMainWnd) {
EnumWindows((WNDENUMPROC)EnumWinProc, (long)&ep);
//没有下面的一行,CPU的使用率会高居不下,同时其它的程序
//也会执行的很慢(包括程序启动的Notepad.exe)
if (ep.hMainWnd==NULL) Sleep(20);
}
//EnumWindows((WNDENUMPROC)EnumWinProc, (long)&ep);
}
//此时的 ep.hMainWnd 就是你要的NodePad.exe窗口的句柄
//接下来由hwnd得到CWND *
wnd = ep.hMainWnd;
if(wnd == NULL) AfxMessageBox("Fasle");
CWnd * tc = FromHandle(wnd);
//获取
wnd = tc->GetTopWindow()->m_hWnd;
::SendMessage(tw2,WM_CHAR,s[i],0);
//OK啦
遍历进程的代码下次再发了
keybd_event(VK_SHIFT,0,0,0); //模拟按下shift键
keybd_event(VK_LCONTROL,0,0,0); //模拟按下ctrl键
int iResult = (int)ShellExecute(NULL,"open","C:\abcd.exe",NULL,NULL,SW_SHOWNORMAL); //执行应用程序
Sleep(1000); //停顿一秒
keybd_event(VK_LCONTROL,0,KEYEVENTF_KEYUP,0); //释放ctrl键
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); //释放shift键
注意: 使用完一定要释放按键,否则整个系统都是一直按下ctrl+shift键,让你不得不注销用户,呵呵