在操作系统中,鼠标和键盘的操作会被转换为相应的系统消息,窗口过程在接收到消息后会进行对应的处理。发送消息,我们可以使用SendMessage()和PostMessage(),所以,只要使用这两个函数来发送鼠标和键盘的相关消息就可以了。此外,还可以通过keybd_event()和mouse_event()两个专用的函数进行鼠标和键盘按键的模拟操作。
下面是一个简单的向指定窗口发送消息的例子:
1.新建一个MFC基于Dialog的项目,界面如下:
设置窗口标题编辑框的ID为:IDC_EDIT_CAPTION,绑定成员变量:m_StrCaption;
设置刷新频率编辑框的ID为:IDC_EDIT_INTERVAL;
设置开始按钮的ID为:IDC_BTN_START,绑定成员控件:m_Start。
2.完成按钮点击事件的代码如下:
voidCMyDlg::OnBtnStart()
{
CString strBtn;
int nInterval = 0;
//获取窗口标题
GetDlgItemText(IDC_EDIT_CAPTION,m_StrCaption);
//获取输入的刷新频率
nInterval =GetDlgItemInt(IDC_EDIT_INTERVAL,FALSE, TRUE);
//判断输入是否为非法
if(m_StrCaption == " " ||nInterval == 0)
{
return;
}
//获取按钮的标题
m_Start.GetWindowText(strBtn);
if(strBtn == "开始")
{
//设置定时器
SetTimer(1, nInterval * 1000, NULL);
m_Start.SetWindowText("停止");
GetDlgItem(IDC_EDIT_CAPTION)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_INTERVAL)->EnableWindow(FALSE);
}else{//MessageBox("jieshu");
//结束定时器
KillTimer(1);
m_Start.SetWindowText("开始");
GetDlgItem(IDC_EDIT_CAPTION)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_INTERVAL)->EnableWindow(TRUE);
}
}
3.工程名Dlg.h文件中,添加成员函数:
4.实现添加的成员函数:
voidCMyDlg::OnTimer(UINT nIDEvent)
{
//根据窗口标题获得窗口句柄
HWND hWnd =::FindWindow(NULL,m_StrCaption.GetBuffer(0));
//发送键盘按下,此处模拟F5键
::PostMessage(hWnd, WM_KEYDOWN, VK_F5, 1);
Sleep(100);
//发送键盘弹起
::PostMessage(hWnd, WM_KEYUP, VK_F5, 1);
CDialog::OnTimer(nIDEvent);
}
5.在工程名Dlg.cpp文件中,添加消息映射,将消息和对应的处理函数关联起来:
注:Timer的对应消息是WM_TIMER。
至此,这个简单的小项目就完成了。要获得一个窗口的标题,向大家介绍spy++,用法可以在网上搜。下面是获得浏览器标题的画面:
通过获得指定窗口的标题,就可以向该窗口发送各种信息。运行我们写好的程序设置相应的字段后,就可以看到指定的浏览器窗口每个一段时间将进行一次刷新(因为我们模拟了F5键的消息)。
程序源码:
http://pan.baidu.com/s/1dFv2xyh