利用Win32 API写一个支持多坐标的鼠标连点器.

一、界面设计

利用Win32 API的子窗口控件(纯写代码)完成。

            HFONT hFont = CreateFont(20,7,0,0,400,FALSE, FALSE, FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,FF_DONTCARE,TEXT("微软雅黑"));

            TextTime = CreateWindowEx(0,"STATIC","点击时间间隔(ms):",WS_CHILD|WS_VISIBLE|SS_CENTER|SS_CENTERIMAGE,30,40,125,20,hwnd,(HMENU)1,0,0);
            TimeEdit = CreateWindowEx(0,"EDIT","",WS_CHILD|WS_VISIBLE|WS_BORDER|ES_NUMBER|ES_AUTOHSCROLL,165,40,70,25,hwnd,(HMENU)2,0,0);

            ChoiceGroupBox = CreateWindowEx(0,"BUTTON","按键选择",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,25,120,350,100,hwnd,(HMENU)3,0,0);

            RadioButtonLeft = CreateWindowEx(0,"BUTTON","左键",WS_GROUP|WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,5,30,80,40,ChoiceGroupBox,(HMENU)4,0,0);
            RadioButtonMid = CreateWindowEx(0,"BUTTON","中键",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,120,30,80,40,ChoiceGroupBox,(HMENU)5,0,0);
            RadioButtonRight = CreateWindowEx(0,"BUTTON","右键",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,225,30,80,40,ChoiceGroupBox,(HMENU)6,0,0);

            PositionList = CreateWindowEx(0,"LISTBOX","坐标",WS_CHILD|WS_BORDER|WS_VISIBLE|(LBS_STANDARD^LBS_SORT),25,255,180,210,hwnd,(HMENU)7,0,0);
            AddButton = CreateWindowEx(0,"BUTTON","添加",WS_CHILD|WS_BORDER|WS_VISIBLE|BS_PUSHBUTTON|BS_FLAT,25,480,40,25,hwnd,(HMENU)71,0,0);
            DeleteButton = CreateWindowEx(0,"BUTTON","删除",WS_CHILD|WS_BORDER|WS_VISIBLE|BS_PUSHBUTTON|BS_FLAT,75,480,40,25,hwnd,(HMENU)72,0,0);
            ClearButton = CreateWindowEx(0,"BUTTON","清空",WS_CHILD|WS_BORDER|WS_VISIBLE|BS_PUSHBUTTON|BS_FLAT,125,480,40*2,25,hwnd,(HMENU)73,0,0);

            TextPosition = CreateWindowEx(0,"STATIC","坐标(Ctrl+O锁定)",WS_BORDER|WS_CHILD|WS_VISIBLE|SS_CENTER|SS_CENTERIMAGE,250,255,130,20,hwnd,(HMENU)8,0,0);
            PositionXEdit = CreateWindowEx(0,"EDIT","",WS_CHILD|WS_VISIBLE|ES_NUMBER|ES_AUTOHSCROLL|ES_READONLY|WS_BORDER,240,300,70,25,hwnd,(HMENU)9,0,0);
            PositionYEdit = CreateWindowEx(0,"EDIT","",WS_CHILD|WS_VISIBLE|ES_NUMBER|ES_AUTOHSCROLL|ES_READONLY|WS_BORDER,315,300,70,25,hwnd,(HMENU)10,0,0);

            StartButton = CreateWindowEx(0,"BUTTON","开始(Ctrl+S)",WS_CHILD|WS_BORDER|WS_VISIBLE|BS_PUSHBUTTON|BS_FLAT,230,400,95,35,hwnd,(HMENU)11,0,0);
            EndButton = CreateWindowEx(0,"BUTTON","停止(Ctrl+E)",WS_CHILD|WS_BORDER|WS_VISIBLE|BS_PUSHBUTTON|BS_FLAT,230,435,95,35,hwnd,(HMENU)12,0,0);

            SendMessage(ChoiceGroupBox,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(RadioButtonLeft,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(RadioButtonMid,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(RadioButtonRight,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(TextTime,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(TimeEdit,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(StartButton,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(EndButton,WM_SETFONT,(WPARAM)hFont,0);

            SendMessage(PositionList,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(AddButton,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(DeleteButton,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(ClearButton,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(TextPosition,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(PositionXEdit,WM_SETFONT,(WPARAM)hFont,0);
            SendMessage(PositionYEdit,WM_SETFONT,(WPARAM)hFont,0);
            break;

二、主要用到的API函数:mouse_event

1.函数声明:
VOID WINAPI mouse_event(
  _In_ DWORD     dwFlags,
  _In_ DWORD     dx,
  _In_ DWORD     dy,
  _In_ DWORD     dwData,
  _In_ ULONG_PTR dwExtraInfo
);

2.官方文档参考:mouse_event

三、实现思路:

1.写出窗口整体框架,用CreateWindowEx创建窗口并将窗口拓展风格设置为WS_EX_TOPMOST,始终将窗口放置于最上层。

2.窗口创建完毕后用RegisterHotkey注册热键,Ctrl+O表示锁定鼠标坐标,Ctrl+S表示连续点击开始,Ctrl+E表示点击结束.用消息WM_HOTKEY处理消息。

3.WM_CREATE创建所有要用到的子窗口控件。

4.设置WM_TIMER消息,用于监控鼠标坐标,使用GetCursorPos获取.

5.各项信息填写完毕后,设置WM_TIMER消息中使用mouse_event实现鼠标点击。

6.按下Ctrl+E后,用KillTimer结束计时器。

四、完整代码:

https://github.com/Vmpy/Windows-Toy/blob/master/MouseClick-Multi-coordinate/Code.cpp

猜你喜欢

转载自blog.csdn.net/qq_30743557/article/details/80974451
今日推荐