日韩性视频-久久久蜜桃-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和鼠标钩子小程序的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 九色蝌蚪9l视频蝌蚪9l视频 | 日韩视频久久 | 中日韩午夜理伦电影免费 | 成人av无码一区二区三区 | 成人污污www网站免费丝瓜 | 国产一二区在线观看 | 中国美女毛片 | 欧日韩在线观看 | 国产一卡二卡在线 | 亚洲天堂久久久久 | 性猛╳xxx乱大交 | 无码成人精品区在线观看 | 中文字幕一区二区在线播放 | 久久午夜夜伦鲁鲁片无码免费 | 日韩精品在线免费观看视频 | 日韩伦理一区二区 | 中文字幕在线三区 | 中文字幕一区二区人妻电影丶 | 日韩激情成人 | 亚洲成人不卡 | 老司机免费精品视频 | 免费看a级黄色片 | 成年人爱爱视频 | 国产精品黄视频 | 少妇被狂c下部羞羞漫画 | 国产一区二区视频播放 | 手机在线不卡av | 波多野一区二区 | 一级v片| 美国一级大黄一片免费中文 | 日韩av不卡在线播放 | 色偷偷免费费视频在线 | 十八岁世界在线观看高清免费韩剧 | 日本视频免费观看 | 日本精品视频在线观看 | 国产精品一区二区无码对白 | 精品人妻一区二区三区日产 | 香蕉久久夜色精品国产使用方法 | 日韩亚洲欧美精品 | 偷拍亚洲欧美 | 99热这里只有精品1 亚洲人交配视频 | 亚洲第一视频在线播放 | 麻豆tv在线| 波多野结衣有码 | 欧美草比视频 | 亚洲无人区码一码二码三码 | 秋霞午夜伦理 | av网在线 | 国产精品啊啊啊 | 亚洲男人av | 国产美女自慰在线观看 | www欧美日韩 | www.黄色免费 | 亚洲精选久久久 | 97碰| 日韩成人无码影院 | 内射无码专区久久亚洲 | 精品久久国产字幕高潮 | 欧美日韩三级 | 青青草伊人网 | 欧美一级精品 | 九色porn| 亚洲精久 | 丁香婷婷六月 | 男生坤坤放进女生坤坤里 | 日韩成人免费在线视频 | 色综合久久精品亚洲国产 | 四虎精品在线观看 | 在线视频 日韩 | 日韩美女毛片 | 激情图片区 | 射进来av影视| xxxx.国产| 国产com| 国产视频第一页 | 波多野结衣在线观看一区 | 亚洲v欧美| 嫩草影院av | 久久久国产精品黄毛片 | 999久久久 | 大尺度摸揉捏胸床戏视频 | 波多野结衣av一区二区全免费观看 | 国产精品成人aaaaa网站 | 又黄又色又爽的视频 | 青草青在线视频 | 五月天婷婷影院 | 国产日韩91 | 蜜桃久久久久久久 | 欧美视频一区二区 | 蜜臀av一区二区三区有限公司 | 在线免费观看污网站 | 欧美va在线观看 | 熟妇人妻一区二区三区四区 | 中文资源在线观看 | 亚洲精品综合精品自拍 | 国产黄a三级三级三级看三级男男 | 免费在线精品视频 | 欧美激情一二区 | 毛片链接 |