日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【IPC-钩子】WM_COPYDATA和鼠标钩子小程序

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【IPC-钩子】WM_COPYDATA和鼠标钩子小程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【IPC-鉤子】WM_COPYDATA和鼠標鉤子小程序
作者:? 來自:? 閱讀次數: 218 [大 中 小]
--------------------------------------------------------------------------------
?
? WM_COPYDATA和鼠標鉤子的簡單例子

作者:enoloo

這個小程序創建了一個全局鼠標鉤子,獲取目標窗口的一些屬性,然后通過WM_COPYDATA將結果傳遞給主程序。程序效果和部分代碼如下:

===========================================================
/*
*文件名:mouse_hook.h
*使用:鉤子dll和程序共同使用
*用途:申明鉤子類,消息結構
*/
class AFX_EXT_CLASS Cmousehook:public CObject //AFX_EXT_CLASS輸出類
{
public:
?Cmousehook();
?~Cmousehook();
?//設置鉤子
?BOOL starthook(HWND hWnd);
?//取消鉤子
?BOOL stophook();
};
#define SIZETEXT 100
struct Msg
{
?HWND hwnd;??? //窗口句柄
?LONG style;????? //窗口樣式
?LONG exstyle;??? //擴展樣式
?char caption[SIZETEXT];? //窗口名
?char parentcaption[SIZETEXT]; //父窗口名
?char classname[SIZETEXT];? //類名
?DWORD threadid;?? //線程id
?DWORD processid;?? //進程id
};
?
1,dll程序部分:
===========================================================
//mouse_hook.cpp[部分]

#pragma data_seg("shared")
HWND? g_hwnd = NULL;? //主程序的窗口句柄,用于給主程序發送消息

//臨時窗口句柄,避免在同一個窗口中多次激發鼠標消息發送到程序
HWND? g_prehwnd = NULL;
??
HHOOK g_hook = NULL;? //鉤子句柄
Msg msg = {0};? //上面頭文件定義的消息,傳遞給主程序
#pragma data_seg()
#pragma comment(linker,"/SECTION:shared,rws")

//實例句柄
HINSTANCE g_hInstance = NULL;
?
//給主程序用SendMessage發送WM_COPYDATA消息
BOOL SendMsg(HWND hwnd,LONG style,LONG exstyle,DWORD tid,DWORD pid,char* buf1,char* buf2,char* buf3)
{
?Msg msg;
?msg.hwnd = hwnd;
?msg.style = style;
?msg.exstyle = exstyle;
?msg.threadid = tid;
?msg.processid = pid;
?strcpy(msg.caption,buf1);? //窗口文本
?strcpy(msg.parentcaption,buf2); //父窗口文本
?strcpy(msg.classname,buf3);? //窗口類名
?if(IsWindow(g_hwnd))
?{
?
? COPYDATASTRUCT cs;
? cs.cbData = sizeof(Msg); //發送數據cs.lpData的大小
? cs.dwData = 0;? //現在沒有使用
? cs.lpData = &msg;? //要發送的數據指針
? //發送消息給主程序
? return SendMessage(g_hwnd,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)&cs);
?
?}
?return false;
}
Cmousehook::Cmousehook()
{
}

Cmousehook::~Cmousehook()
{
?stophook();
}

//開啟鼠標鉤子
BOOL Cmousehook::starthook(HWND hwnd)
{
?ASSERT(hwnd);
?//全局鉤子
?g_hook = SetWindowsHookEx(WH_MOUSE,HOOKPROC(hookproc),g_hInstance,0);
?if(!g_hook)
?{
? return false;
?}
?g_hwnd = hwnd;
?return true;
}

LRESULT WINAPI hookproc(int code,WPARAM wParam,LPARAM lParam)
{
?ASSERT(g_hook);
?char buf1[SIZETEXT]; //存儲窗口文字
?char buf2[SIZETEXT]; //存儲父窗口文字
?char buf3[SIZETEXT]; //存儲類名
?DWORD tid;? //線程id
?DWORD pid;? //進程id
?LONG style;? //窗口樣式
?LONG exstyle;? //窗口擴充樣式
?
?
?HWND htarget;
?HWND htarget2;
?//遠指針
?LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *) lParam;
?if (code >= 0)
?{
? htarget = pMouseHook->hwnd;
? if(htarget != g_prehwnd)
? {
?? GetWindowText(htarget,buf1,SIZETEXT);
?? style = GetWindowLong(htarget,GWL_STYLE);
?? exstyle = GetWindowLong(htarget,GWL_EXSTYLE);
?? tid = GetWindowThreadProcessId(htarget,&pid);
?? pid = pid;???? //獲得進程id
?? GetClassName(htarget,buf3,SIZETEXT); //獲得類名
?? htarget2 = htarget;??? //暫時保存句柄
?? HWND hparent = htarget;
?? while (hparent !=NULL)?? //獲得父窗口句柄
?? {
??? htarget = hparent;
??? hparent = GetParent(htarget);
?? }
?? GetWindowText(htarget,buf2,100);
?? //給主程序發送消息
?? SendMsg(htarget2,style,exstyle,tid,pid,buf1,buf2,buf3);
?? g_prehwnd = htarget2;
? }
?}
?return CallNextHookEx(g_hook,code,wParam,lParam);
}

2,測試程序部分:
===========================================================
//mousehook_testDlg.cpp[部分]

#pragma comment(lib,"mouse_hook.lib") //dll庫
Cmousehook g_hook;??? //定義鉤子對象

//在程序初始化的時候,設置鉤子
g_hook.starthook(GetSafeHwnd());

//程序退出的時候,卸載鉤子
g_hook.stophook();

//接收從鉤子dll傳過來的數據
BOOL CMousehook_testDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
?// TODO: Add your message handler code here and/or call default
?Msg* pmsg =(Msg*)(pCopyDataStruct->lpData);
?CString str;
?str.Format("%d",pmsg->hwnd);
?m_list.SetItemText(0,1,str);
?str.Format("%d",pmsg->style);
?m_list.SetItemText(1,1,str);
?str.Format("%d",pmsg->exstyle);
?m_list.SetItemText(2,1,str);
?str.Format("%d",pmsg->threadid);
?m_list.SetItemText(3,1,str);
?str.Format("%d",pmsg->processid);
?m_list.SetItemText(4,1,str);

?m_list.SetItemText(5,1,pmsg->classname);
?m_list.SetItemText(6,1,pmsg->caption);
?m_list.SetItemText(7,1,pmsg->parentcaption);

?return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
===========================================================

3,說明:
WM_COPYDATA消息能夠在進程間通信。可以通過一個這樣的結構給目標進程通信:
typedef struct tagCOPYDATASTRUCT {
??? ULONG_PTR dwData;?? //發送的附帶信息
??? DWORD???? cbData;?? //發送數據的大小
??? PVOID???? lpData;?? //要發送的數據指針
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
目標進程要接受處理數據,添加WM_COPYDATA消息的處理,
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
其中,pCopyDataStruct包含剛才介紹的那個結構,lpData中是你發送的數據。

需要注意的是,WM_COPYDATA消息保證發送的數據從原進程拷貝到目標進程。但是,WM_COPYDATA消息不能發送HDC,HBITMAP之類的東西,他們對于目標進程來說是無效的。目標進程拿到這些數據不能在原進程作任何事情,因為他們屬于不同的進程。

關于全局鉤子。如果系統中的一個線程創建了一個全局鼠標鉤子,當鼠標移動到系統中某個進程擁有的窗口下的時候,系統首先要判斷鉤子處理程序hookproc所在的dll有沒有映射到這個進程,如果沒有,則強制映射這個dll到進程地址空間。
所以,給主程序發送消息的dll可能各不相同。那么這些dll之間怎么溝通?這需要dll共享數據段。
===========================================================
#pragma data_seg("shared")
HWND? g_hwnd = NULL;? //主程序的窗口句柄,用于給主程序發送消息

//臨時窗口句柄,避免在同一個窗口中多次激發鼠標消息發送到程序
HWND? g_prehwnd = NULL;
??
HHOOK g_hook = NULL;? //鉤子句柄
Msg msg = {0};? //上面頭文件定義的消息,傳遞給主程序
#pragma data_seg()
#pragma comment(linker,"/SECTION:shared,rws")
===========================================================

比如上面的,g_hook是創建的鉤子句柄。因為整個系統并不是每個dll都有一個,所以應該是共享的,他在CallNextHookEx中用到,如果不共享,就會出錯;再比如g_hwnd,主程序傳遞給dll的句柄,放在共享區中,所有的dll用一個就行了;g_prehwnd是用來避免在一個窗口中重復向輸出窗口發送消息的(見代碼),如果把它移出來,你看看效果...

?

總結

以上是生活随笔為你收集整理的【IPC-钩子】WM_COPYDATA和鼠标钩子小程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷久久亚洲 | 亚洲在线观看免费 | 丰满少妇一区二区三区视频 | 婷婷综合色 | 成年人的毛片 | 一区二区三区四区亚洲 | 边添小泬边狠狠躁视频 | 性感美女av在线 | 成人羞羞国产免费动态 | 白浆四溢 | 国产成人无码久久久精品天美传媒 | 日韩亚洲欧美精品 | 国产又黄又猛视频 | 亚洲人成免费电影 | 免费成人电影在线观看 | 欧美综合第一页 | 九九九色 | 中文字幕在线观看国产 | 同人动漫在线观看 | www.爆操| 精品福利三区3d卡通动漫 | 老司机精品福利导航 | 欧美精品123 | 性高潮久久久久 | 国产免费脚交足视频在线观看 | 欧美日韩大片在线观看 | 人人爽人人射 | 日本人妻不卡一区二区三区中文字幕 | 456亚洲视频| 久久久久久亚洲精品中文字幕 | 中文字幕第一区综合 | 999久久久久 | 9i在线看片成人免费 | 先锋资源一区二区 | 日韩欧美一二三区 | 日本色悠悠 | 丰满少妇在线观看bd | 欧美国产高清 | 一区不卡视频 | 性欧美video另类hd尤物 | 在线观看中出 | 天天操天天干天天操 | 成人宗合| www婷婷 | 狠狠操天天操夜夜操 | 日本免费一二三区 | 亚洲av无码国产精品久久不卡 | 中文字幕一区二区三区波野结 | 亚洲在线观看免费 | 国产亚洲精品一区二区三区 | 午夜一二三区 | 亚洲一区福利视频 | 少妇久久久久 | 久久久久久久久久久电影 | 特黄特色大片免费播放器使用方法 | 3d动漫精品啪啪一区二区下载 | 99性趣网 | 久久av免费 | 国产精品久久久久91 | 欧美精品在线第一页 | 日本理论片午伦夜理片在线观看 | 欧美日韩色图片 | 亚洲视频黄 | 欧美精品一区在线观看 | 日韩在线精品视频一区二区涩爱 | 少妇真实被内射视频三四区 | 激情久| 国产又粗又长又硬免费视频 | 国产成人欧美一区二区三区91 | 国内精品一区二区三区 | 又粗又猛又爽又黄少妇视频网站 | 91在线观看免费高清 | 免费在线观看视频 | 爱情岛av| 久草福利在线视频 | 精品国产第一页 | 国产精品video| 天天干天天操心 | 9久久9毛片又大又硬又粗 | 狠狠艹狠狠干 | 亚洲精品偷拍 | 亚洲综合视频在线观看 | 午夜窝窝 | av大全在线观看 | 久草青青草 | 欧美人体一区二区 | 中文字幕第11页 | 97在线免费公开视频 | 日韩va| 空姐吹箫视频大全 | 精品美女久久久久 | 黄色污污网站 | sm调教羞耻姿势图片 | 激情爱爱网站 | 国产毛片a | 国产视频一区二区在线 | 一级黄色录象 | 一级特级毛片 | 永久黄网站色视频免费观看w |