环境VS2013+Win7X64,根据学习资料。
模拟键盘按键或鼠标单击的方式向浏览器发送刷新按键(F5)。
获得进程的句柄通过FindWindow
HWND hWnd = ::FindWindow(NULL, m_csCaption.GetBuffer(0)); //因为VS2013建立的程序默认是,Unicode的编码方式,所以为L“进程的标题”
::SetForegroundWindow(hWnd); //该函数将创建指定窗口的线程设置前台,并且激活该窗口。
一:模拟键盘按键:获得了进程的句柄,可以用keybd_event来实现
keybd_event(VK_F5, 0, 0, 0);
POINT pt = { 0 };
::ClientToScreen(hWnd, &pt); //获得当前鼠标的坐标
SetCursorPos(pt.x + 36, pt.y + 395); //设置鼠标按键是的坐标
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0); //调用函数实现按下鼠标右键
Sleep(100);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); //调用函数实现按下鼠标抬起
keybd_event(0x52, 0, 0, 0); //上面两个只是实现了弹出鼠标右键的界面,实现页面刷新的是这句。
三:利用API来发送按键
::PostMessage(hWnd, WM_KEYDOWN, VK_F5, 1); //此处应该用PostMessage,因为SendMessage不起作用,至少在我测试中没有调用。
Sleep(50);
::PostMessage(hWnd, WM_KEYUP, VK_F5, 1); //模拟键盘抬起
注:以上是实现了向浏览器来发送按键,或键盘的操作。下面是自己的客户端向服务端来发送消息。获取窗口句柄还是相同的,下面就不写了。
四:利用自定义消息函数
发送端
首先客户端自定义消息函数,
#define WM_UMSG WM_USER + 1
发送消息
::SendMessage(hWnd, WM_UMSG, (WPARAM)first, (LPARAM)seconde);
接收端
定义同样的消息函数
#define WM_UMSG WM_USER + 1
增加消息映射
BEGIN_MESSAGE_MAP(CZdyxxTxDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_UMSG,RevcMsg) //自定义的消息映射
END_MESSAGE_MAP()
在头文件中声明接收消息的函数
LRESULT RevcMsg(WPARAM wParam, LPARAM lParam);
LRESULT CZdyxxTxDlg::RevcMsg(WPARAM wParam, LPARAM lParam)
{
int nNum1, nNum2, nSum;
nNum1 = (int)wParam;
nNum2 = (int)lParam;
nSum = nNum1 + nNum2;
CString str;
str.Format(_T("%d"), nSum); //因为是Unicode编码方式,所以_T("%d")这种方式来格式化字符串。
//char a[10] = { 0 };
//_itoa_s(nSum, a, 2);
SetDlgItemText(IDC_EDIT_SUM, str);
return NULL;
}
发送端
//准备消息
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = (txtData.GetLength() + 1)*sizeof(TCHAR); //计算Unicode模式下的宽字符数,否则出现乱码或者截断字符串
cds.lpData = (void*)txtData.GetBuffer(cds.cbData);
//发送消息
::SendMessage(hWnd, WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);//m_hWnd是当前窗体的句柄。
添加消息函数WM_COPYDATA
BOOL CXxServerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString strText;
DWORD dwPid = 0;
::GetWindowThreadProcessId(pWnd->m_hWnd, &dwPid); //获得进程的ID
strText.Format(_T("PID = [%d]的进程发来的消息:%s"), dwPid, pCopyDataStruct->lpData);
m_ListData.AddString(strText); //m_ListData是一个List Box控件。
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}
留痕。方便以后查看。欢迎各位大虾批评指正。