用钩子函数实现鼠标动作录制
在日常的一些操作中,會遇到重復的鼠標動作,類似按鍵精靈的軟件就會成為比較好的助手。這里借助網上查找的資料自己實現了一個簡單的鼠標動作錄制軟件。
完成界面如圖:
錄制
錄制鼠標動作首先需要截獲。鉤子函數是一種對Windows系統進程進行監聽的函數,可以用來截獲鼠標、鍵盤的消息。鉤子函數的實現方法很多,這里借鑒的是一種比較簡單的方法,但是注意要在MFC中使用,我曾在控制臺程序下使用,會導致程序卡死,原因尚未知。
(參考:http://www.cnblogs.com/gongxijun/p/5043825.html
http://www.cnblogs.com/gongxijun/p/5043825.html)
關鍵回調函數如下:
實現的功能是,從輸入框讀取要保存的文件名,然后在第一次點擊后開始錄制,把操作的窗口名保存到文件,然后保存坐標。在之后每一次點擊,計算與之前的時間差(參考:http://blog.csdn.net/coder_xia/article/details/6566708)
運行
運行錄制文件中的數據,只需要一些Windows的API即可實現鼠標點擊:
char* A_p = UnicodeToAnsi(m_infile.GetBuffer());ifstream fin(A_p);if (fin.fail()){MessageBox(L"打開文件失敗!", NULL, MB_OK);return;}int x, y;char fname[100];fin >> fname;HWND hWnd;hWnd = FindWindowA(NULL, fname);if (!hWnd){MessageBox(L"窗口不存在!", NULL, MB_OK);return;}while (fin >> x >> y){LPARAM lParam = MAKELPARAM(x, y);::SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam);Sleep(250);::SendMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, lParam);Sleep(250);int wait;if (fin >> wait){Sleep(wait);}else{break;}}fin.close();但在對話框的函數中使用上述方法,會導致運行后程序卡死,因此需要多線程編程,使二者運行分離;同時,在將讀入的數據用一個數據結構描述后再進行運行會使得運行變得可控。
class mouse_act{HWND hWnd;std::vector<int>x;std::vector<int>y;std::vector<int>wait;int count = 0; public:mouse_act(HWND wd) :hWnd(wd){ ; }mouse_act(){ hWnd = NULL; }void add(int _x, int _y, int _wait = -1){x.push_back(_x);y.push_back(_y);wait.push_back(_wait);}void play(){if (!hWnd)return;LPARAM lParam = MAKELPARAM(x[count], y[count]);::SendMessage(this->hWnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam);Sleep(250);::SendMessage(this->hWnd, WM_LBUTTONUP, MK_LBUTTON, lParam);Sleep(250);if (wait[count] > 0){Sleep(wait[count]);count++;}else{count = 0;}}void clear(){hWnd = NULL;}bool isNULL(){return hWnd == NULL;} };mouse_act act_player;使用多線程的方法(參考:http://www.cnblogs.com/codingmengmeng/p/5913068.html),使其在全局變量控制下逐步運行:
bool play_flag = false; DWORD WINAPI PlayMouseAction(LPVOID lpParamter){while(play_flag){act_player.play();}return 0; }總結
以上是生活随笔為你收集整理的用钩子函数实现鼠标动作录制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: batplot:图示Bland-Altm
- 下一篇: 蒙特卡罗方法入门