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