www.pudn.com > MouDevDetect.rar > MouDevDetectDlg.cpp


// MouDevDetectDlg.cpp : 实现文件 
// 
 
#include "stdafx.h" 
#include "MouDevDetect.h" 
#include "MouDevDetectDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
 
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// 对话框数据 
	enum { IDD = IDD_ABOUTBOX }; 
 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持 
 
// 实现 
protected: 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
END_MESSAGE_MAP() 
 
 
// CMouDevDetectDlg 对话框 
 
 
 
 
CMouDevDetectDlg::CMouDevDetectDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CMouDevDetectDlg::IDD, pParent) 
	, rMouseNo(_T("")) 
	, m_rmouUsing(0) 
	, m_preM1(0) 
	, m_preM2(0) 
	, m_preM3(0) 
	, m_preM4(0) 
	, m_port(0) 
	, m_idM1(0) 
	, m_idM2(0) 
	, m_idM3(0) 
	, m_idM4(0) 
{ 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CMouDevDetectDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	DDX_Control(pDX, IDC_LIST_MOUSE, m_rmouseList); 
	DDX_Text(pDX, IDC_MOUSENO, rMouseNo); 
	//DDX_Text(pDX, IDC_MOUSEUSING, m_rmouUsing); 
	DDX_Text(pDX, IDC_SRM1, m_preM1); 
	DDX_Text(pDX, IDC_SRM2, m_preM2); 
	DDX_Text(pDX, IDC_SRM3, m_preM3); 
	DDX_Text(pDX, IDC_SRM4, m_preM4); 
	DDX_Text(pDX, IDC_PORT, m_port); 
	DDX_Text(pDX, IDC_RM1, m_idM1); 
	DDX_Text(pDX, IDC_RM2, m_idM2); 
	DDX_Text(pDX, IDC_RM3, m_idM3); 
	DDX_Text(pDX, IDC_RM4, m_idM4); 
	DDX_Control(pDX, IDC_IPADDRESS1, serverIP); 
} 
 
BEGIN_MESSAGE_MAP(CMouDevDetectDlg, CDialog) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_MESSAGE(WM_INPUT,OnInPut) 
	ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) 
	//}}AFX_MSG_MAP 
	ON_WM_SIZE() 
	ON_BN_CLICKED(IDC_BRM1, &CMouDevDetectDlg::OnBnClickedBrm1) 
	ON_BN_CLICKED(IDC_BRM2, &CMouDevDetectDlg::OnBnClickedBrm2) 
	ON_BN_CLICKED(IDC_BRM3, &CMouDevDetectDlg::OnBnClickedBrm3) 
	ON_BN_CLICKED(IDC_BRM4, &CMouDevDetectDlg::OnBnClickedBrm4) 
	ON_BN_CLICKED(IDC_BUTTON_CONFIG, &CMouDevDetectDlg::OnBnClickedButtonConfig) 
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CMouDevDetectDlg::OnBnClickedButtonClear) 
	ON_BN_CLICKED(IDC_BUTTON_START, &CMouDevDetectDlg::OnBnClickedButtonStart) 
	ON_WM_DESTROY() 
	ON_BN_CLICKED(IDC_BUTTON_STOP, &CMouDevDetectDlg::OnBnClickedButtonStop) 
END_MESSAGE_MAP() 
 
 
// CMouDevDetectDlg 消息处理程序 
 
BOOL CMouDevDetectDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// 将“关于...”菜单项添加到系统菜单中。 
 
	// IDM_ABOUTBOX 必须在系统命令范围内。 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 
	//  执行此操作 
	SetIcon(m_hIcon, TRUE);			// 设置大图标 
	SetIcon(m_hIcon, FALSE);		// 设置小图标 
 
	// TODO: 在此添加额外的初始化代码 
	 
	//自定义的一些初始化信息 
	InitRawInput(); 
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); 
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(false); 
	//初始化到托盘 
	pnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);//该结构体大小 
    pnid.hWnd=m_hWnd;    //窗口句柄 
    pnid.uID=(UINT)m_hIcon;      //图标句柄 
    pnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; //图标有效|自定义消息有效|鼠标指向显示文字有效 
    pnid.uCallbackMessage=WM_MYMESSAGE;//自定义的消息名称 
    pnid.hIcon=m_hIcon;         //图标句柄 
	wcscpy_s(pnid.szTip,_T("Raw Mouse Detection"));//鼠标指向所显示的文字(unicode) 
	//strcpy_s(pnid.szTip,_T("Raw Mouse Detection"));//鼠标指向所显示的文字 
	//pnid.szTip=_T("kk"); 
	//pnid.szTip=L"Raw Mouse Detection"; 
 
	readConfig(); 
	flag=0; 
	//网络相关 
	touch_count=0; 
	//charIP="202.120.34.85"; 
 
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 
} 
bool CMouDevDetectDlg::init_udp() 
{ 
	WORD wVersionRequested = MAKEWORD(1,1); 
	WSADATA wsaData; 
	int nRet; 
	nRet = WSAStartup(wVersionRequested, &wsaData); 
	if (wsaData.wVersion != wVersionRequested) 
	{	 
		MessageBox(_T("Wrong net version")); 
			return 0; 
	} 
	LPHOSTENT lpHostEntry; 
	lpHostEntry = gethostbyname(charIP); 
	if (lpHostEntry == NULL) 
	{ 
		MessageBox(_T("Getting server failed!")); 
		return 0; 
	} 
	theSocket = socket(AF_INET,			// Address family 
					   SOCK_DGRAM,		// Socket type 
					   IPPROTO_UDP);	// Protocol 
	if (theSocket == INVALID_SOCKET) 
	{ 
		MessageBox(_T("Creating UDP socket failed!")); 
		return 0; 
	} 
	saServer.sin_family = AF_INET; 
	saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); 
										// ^ Server's address 
	saServer.sin_port = htons(m_port);	// Port number from command line 
	return 1; 
} 
void CMouDevDetectDlg::sendctldata(SOCKET theSocket, SOCKADDR_IN saServer,char *szBuf) 
{ 
	int nRet = sendto(theSocket,				// Socket 
				  szBuf,					// Data buffer 
				  strlen(szBuf),			// Length of data 
				  0,						// Flags 
				  (LPSOCKADDR)&saServer,	// Server address 
				  sizeof(struct sockaddr)); // Length of address 
	if (nRet == SOCKET_ERROR) 
	{ 
		//MessageBox(_T("Sending UDP message failed!")); 
		closesocket(theSocket); 
		return; 
	} 
} 
 
void CMouDevDetectDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// 如果向对话框添加最小化按钮,则需要下面的代码 
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, 
//  这将由框架自动完成。 
 
void CMouDevDetectDlg::OnPaint() 
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // 用于绘制的设备上下文 
 
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); 
 
		// 使图标在工作矩形中居中 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// 绘制图标 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
//当用户拖动最小化窗口时系统调用此函数取得光标显示。 
// 
HCURSOR CMouDevDetectDlg::OnQueryDragIcon() 
{ 
	return static_cast(m_hIcon); 
} 
 
void CMouDevDetectDlg::InitRawInput() 
{ 
	CString str; 
	int mouseNo=0; 
	if(GetRawInputDeviceList(NULL,&nDevices,sizeof(RAWINPUTDEVICELIST))!=0) 
	{ 
		MessageBox(_T("获取鼠标设备数目失败!")); 
		return ;	 
	} 
	pRawInputDeviceList = (RAWINPUTDEVICELIST *)malloc(sizeof(RAWINPUTDEVICELIST) * nDevices); 
	GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST)); 
	for(int i=0; i< nDevices;i++) 
	{ 
		if(pRawInputDeviceList[i].dwType==RIM_TYPEMOUSE) 
		{ 
			mouseNo++; 
			str.Format(_T("%d"),pRawInputDeviceList[i].hDevice); 
			m_rmouseList.AddString(str); 
		} 
	} 
	str.Format(_T("%d"),mouseNo); 
	rMouseNo=str; 
	UpdateData(false); 
	 
	// after the job, free the RAWINPUTDEVICELIST 
	free(pRawInputDeviceList); 
	//str.Format(_T("%d"),nDevices); 
	//MessageBox(str); 
	Rid[0].usUsagePage=0x01; 
	Rid[0].usUsage=0x02; 
	//只要这个设置成下面值就可以在后台监视了,主要要设hWndTarget 
	Rid[0].dwFlags =RIDEV_INPUTSINK;// RIDEV_NOLEGACY;   // adds HID mouse and also ignores legacy mouse messages 
	Rid[0].hwndTarget =this->m_hWnd/*NULL*/; 
	if (RegisterRawInputDevices(Rid, 1, sizeof (Rid [0])) == FALSE) { 
		MessageBox(_T("注册监视鼠标设备失败!")); 
		return ; 
	} 
} 
//Raw Mouse Message Dilling Functions 
LRESULT CMouDevDetectDlg::OnInPut(WPARAM wParam, LPARAM lParam) 
{ 
	UINT dwSize; 
	RAWINPUT *raw; 
	LPBYTE lpb; 
	char mousemessage[256];  
 
	GetRawInputData((HRAWINPUT)lParam,RID_INPUT,NULL, &dwSize,sizeof(RAWINPUTHEADER)); 
	lpb = (unsigned char *)malloc(sizeof(LPBYTE) * dwSize); 
	if (lpb == NULL)  
	{ 
		return 0; 
	} 
	if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize,  
				 sizeof(RAWINPUTHEADER)) != dwSize ) 
	{ 
		MessageBox(_T("GetRawInputData doesn't return correct size !"));  
		return 0; 
	} 
	raw = (RAWINPUT*)lpb; 
	if(raw->header.dwType==RIM_TYPEMOUSE) 
	{ 
		m_rmouUsing=(const int)(raw->header.hDevice); 
		if(flag==1) 
		{ 
			touch_count++; 
			if(touch_count==20) 
			{ 
				ctldata(); 
				sendctldata(theSocket,saServer,m_sendData); 
				touch_count=0; 
			} 
		} 
		//UpdateData(false); 
		sprintf_s(mousemessage,"hDevice ID:%d \n usFlags=%04x \nulButtons=%04x \nusButtonFlags=%04x \nusButtonData=%04x \nulRawButtons=%04x \nlLastX=%ld \nlLastY=%ld \nulExtraInformation=%04x\n", 
			raw->header.hDevice, 
			raw->data.mouse.usFlags,  
			raw->data.mouse.ulButtons,  
			raw->data.mouse.usButtonFlags,  
			raw->data.mouse.usButtonData,  
			raw->data.mouse.ulRawButtons,  
			raw->data.mouse.lLastX,  
			raw->data.mouse.lLastY,  
			raw->data.mouse.ulExtraInformation); 
		CString str(mousemessage); 
		//str=(CString)mousemessage; 
		//以下是绘图的函数 
		CRect rect; 
		CWnd *pWnd=GetDlgItem(IDC_DRAW); 
		CDC *pdc=pWnd->GetDC(); 
		pWnd->GetClientRect(&rect); 
		//pdc->TextOutW(rect.left+10,rect.top+10,str,256); 
		//pdc->DrawText(mousemessage,strlen(mousemessage),&rect,DT_CENTER); 
		pdc->FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));  
		pdc->DrawText(str,str.GetLength(),&rect,DT_CENTER); 
		//pdc->DeleteDC(); 
		ReleaseDC(pdc); 
	} 
	 
	free(lpb); 
	//delete lpb; 
	return 0; 
} 
void CMouDevDetectDlg::OnSize(UINT nType, int cx, int cy) 
{ 
	CDialog::OnSize(nType, cx, cy); 
 
	// TODO: 在此处添加消息处理程序代码 
	if (nType==SIZE_MINIMIZED)//如果事件为最小化 
    { 
         Shell_NotifyIcon(NIM_ADD,&pnid);//在托盘区添加图标 
         ShowWindow(SW_HIDE);//隐藏主窗口  
    } 
 
} 
LRESULT CMouDevDetectDlg::OnMyMessage(WPARAM wParam, LPARAM lParam){ 
    if( lParam == WM_LBUTTONDOWN )//如果在图标中单击左键则还原 
    {              
          Shell_NotifyIcon(NIM_DELETE,&pnid);//删除托盘图标 
          ShowWindow(SW_SHOWNORMAL);//显示主窗口 
          this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面 
    } 
	else if(lParam==WM_RBUTTONUP) 
	{ 
		LPPOINT   lpoint=new   tagPOINT;    
        ::GetCursorPos(lpoint);//得到鼠标位置    
        CMenu   menu;    
        menu.CreatePopupMenu();//声明一个弹出式菜单    
        //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已    
        //隐藏),将程序结束。    
        menu.AppendMenu(MF_STRING,WM_DESTROY,_T("关闭"));      
        //确定弹出式菜单的位置    
        menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);    
        //资源回收    
        HMENU   hmenu=menu.Detach();    
        menu.DestroyMenu();    
        delete   lpoint;    
	} 
     return 0; 
} 
 
void CMouDevDetectDlg::OnBnClickedBrm1() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	m_idM1=m_rmouUsing; 
	UpdateData(false); 
} 
 
void CMouDevDetectDlg::OnBnClickedBrm2() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	m_idM2=m_rmouUsing; 
	UpdateData(false); 
} 
 
void CMouDevDetectDlg::OnBnClickedBrm3() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	m_idM3=m_rmouUsing; 
	UpdateData(false); 
} 
 
 
void CMouDevDetectDlg::OnBnClickedBrm4() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	m_idM4=m_rmouUsing; 
	UpdateData(false); 
} 
 
 
 
void CMouDevDetectDlg::OnBnClickedButtonConfig() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	//serverIP.SetAddress(); 
	//serverIP.GetAddress(); 
	UpdateData(); 
 
	if(serverIP.IsBlank())   //判断是否为空  
	{ 
		MessageBox(_T("IP地址为空!")); 
		return ; 
	}  
	BYTE nField0,nField1,nField2,nField3;  
	if(serverIP.GetAddress(nField0,nField1,nField2,nField3) !=4) 
	{ 
		MessageBox(_T("您输入的IP地址不完整!")); 
		serverIP.SetFieldFocus(0); 
		return; 
	} 
	//char ipBuf[100]; 
	sprintf_s(charIP,"%d.%d.%d.%d\0",nField0,nField1,nField2,nField3); 
	strIP=CString(charIP); 
	//MessageBox(strIP); 
	//MessageBox(strPath); 
	//CFile mFile(strPath+_T("\\RMConfig.dat"), CFile::modeWrite|CFile::modeCreate); 
	HANDLE handle; 
	DWORD Num; 
	//MessageBox(strPath+_T("\RMConfig.dat")); 
	//::DeleteFile(strPath+_T("\\RMConfig.dat")); 
	//handle= ::CreateFile(strPath+_T("\\RMConfig.dat"),GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL); 
	handle= ::CreateFile(strPath+_T("RMConfig.dat"),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL); 
	char Buffer[200]; 
	sprintf_s(Buffer,"%d %d %d %d %d %d %d %d %d %d %d %d %d\0", 
		m_idM1,m_preM1, 
		m_idM2,m_preM2, 
		m_idM3,m_preM3, 
		m_idM4,m_preM4, 
		nField0,nField1,nField2,nField3, 
		m_port); 
	strPath = CString(Buffer); 
	//MessageBox(strPath); 
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(true); 
	if(INVALID_HANDLE_VALUE!=handle) 
	{ 
		::SetFilePointer(handle,0,0,FILE_BEGIN); 
		::WriteFile(handle,Buffer,sizeof(Buffer),&Num,NULL); 
		::CloseHandle(handle); 
	} 
	else 
	{ 
		MessageBox(_T("创建配置文件失败!")); 
		return; 
	} 
	MessageBox(_T("设置成功!")); 
} 
 
void CMouDevDetectDlg::OnBnClickedButtonClear() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	m_idM1=0; 
	m_preM1=0; 
	m_idM2=0; 
	m_preM2=0; 
	m_idM3=0; 
	m_preM3=0; 
	m_idM4=0; 
	m_preM4=0; 
	m_port=0; 
	serverIP.ClearAddress(); 
	UpdateData(false); 
} 
 
int chartoint(char *p)//from char * to int 
{ 
		int len=strlen(p); 
		int total=0; 
		int i=0; 
		while (iEnableWindow(true); 
		UpdateData(false); 
		/*CString str; 
		str.Format(_T("%d"),i); 
		MessageBox(str);*/ 
		//MessageBox(CString(szBuffer)); 
	} 
} 
 
void CMouDevDetectDlg::ctldata() 
{ 
	int temp; 
	if(m_rmouUsing==m_idM1) 
	{ 
		temp= m_preM1; 
	} 
	else if(m_rmouUsing==m_idM2) 
	{ 
		temp= m_preM2; 
	} 
	else if(m_rmouUsing==m_idM3) 
	{ 
		temp= m_preM3; 
	} 
	else if(m_rmouUsing==m_idM4) 
	{ 
		temp= m_preM4; 
	} 
	else 
		temp=0; 
	sprintf_s(m_sendData, "Mouse%d" , temp); 
} 
 
void CMouDevDetectDlg::OnBnClickedButtonStart() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	if(init_udp()==0) 
	{ 
		MessageBox(_T("网络初始化失败!")); 
		return; 
	} 
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(false); 
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(true); 
	flag=1; 
} 
 
void CMouDevDetectDlg::OnDestroy() 
{ 
	CDialog::OnDestroy(); 
	 
	// TODO: 在此处添加消息处理程序代码 
	closesocket(theSocket); 
	WSACleanup(); 
} 
 
void CMouDevDetectDlg::OnBnClickedButtonStop() 
{ 
	// TODO: 在此添加控件通知处理程序代码 
	closesocket(theSocket); 
	WSACleanup(); 
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); 
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(true); 
}