C++学习,总结二(模拟鼠标键盘操作和进程之间的通信)

环境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);


二:   模拟鼠标按键:使用的是mouse_event的方法    

	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);

first和seconde是两个int值。


接收端

定义同样的消息函数

#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;
}

五:利用WM_COPYDATA系统消息函数

发送端

//准备消息
	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);
}



留痕。方便以后查看。欢迎各位大虾批评指正。

你可能感兴趣的:(C++)