用钩子函数实现鼠标动作录制
在日常的一些操作中,會遇到重復(fù)的鼠標(biāo)動作,類似按鍵精靈的軟件就會成為比較好的助手。這里借助網(wǎng)上查找的資料自己實(shí)現(xiàn)了一個簡單的鼠標(biāo)動作錄制軟件。
完成界面如圖:
錄制
錄制鼠標(biāo)動作首先需要截獲。鉤子函數(shù)是一種對Windows系統(tǒng)進(jìn)程進(jìn)行監(jiān)聽的函數(shù),可以用來截獲鼠標(biāo)、鍵盤的消息。鉤子函數(shù)的實(shí)現(xiàn)方法很多,這里借鑒的是一種比較簡單的方法,但是注意要在MFC中使用,我曾在控制臺程序下使用,會導(dǎo)致程序卡死,原因尚未知。
(參考:http://www.cnblogs.com/gongxijun/p/5043825.html
http://www.cnblogs.com/gongxijun/p/5043825.html)
關(guān)鍵回調(diào)函數(shù)如下:
實(shí)現(xiàn)的功能是,從輸入框讀取要保存的文件名,然后在第一次點(diǎn)擊后開始錄制,把操作的窗口名保存到文件,然后保存坐標(biāo)。在之后每一次點(diǎn)擊,計算與之前的時間差(參考:http://blog.csdn.net/coder_xia/article/details/6566708)
運(yùn)行
運(yùn)行錄制文件中的數(shù)據(jù),只需要一些Windows的API即可實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊:
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();但在對話框的函數(shù)中使用上述方法,會導(dǎo)致運(yùn)行后程序卡死,因此需要多線程編程,使二者運(yùn)行分離;同時,在將讀入的數(shù)據(jù)用一個數(shù)據(jù)結(jié)構(gòu)描述后再進(jìn)行運(yùn)行會使得運(yùn)行變得可控。
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),使其在全局變量控制下逐步運(yùn)行:
bool play_flag = false; DWORD WINAPI PlayMouseAction(LPVOID lpParamter){while(play_flag){act_player.play();}return 0; }總結(jié)
以上是生活随笔為你收集整理的用钩子函数实现鼠标动作录制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: batplot:图示Bland-Altm
- 下一篇: 蒙特卡罗方法入门