掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
システムフックで使用したDLLを開放するには? (ID:53353)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
'-------------------------------------------------- hook_test.cpp '-------------------------------------------------- #include <windows.h> #include <stdio.h> //修飾子『WINAPI』『CALLBACK』は『__stdcall』で定義されている void GetWindowData(LPARAM lParam); __declspec(dllexport) void CALLBACK SetHook(HWND hwnd_EXEWH); __declspec(dllexport) void CALLBACK FreeHook(void); //共有領域のデータは初期化しないとうまく確保されない #pragma data_seg("share_data") HHOOK g_hHookWnd = 0; HWND g_hwnd_EXEWH = 0; COPYDATASTRUCT g_struct_CDS = {0,0,0}; char char_ClassName[256] = {0}; char char_TitleName[256] = {0}; char char_WH[256] = {0}; #pragma data_seg() HINSTANCE hdll; //BCでは『DllEntryPoint』 BOOL WINAPI DllMain (HINSTANCE hInstance,DWORD reason,LPVOID lpReserved) { //『INSTANCE hinstDLL』 DLLモジュールハンドル //『WORD fdwReason』 関数を呼び出す理由 //『LPVOID lpvReserved』予約済み (void)lpReserved; if(reason == DLL_PROCESS_ATTACH) { hdll = hInstance;//DLLモジュールハンドル保存 } return TRUE; } LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam) { char char_HitFlag = 0; char char_SendString[512] = {0}; if(nCode == HC_ACTION)//メッセージを処理する必要があるか? { if(GetParent(((CWPSTRUCT *)lParam) -> hwnd) == NULL)//親ウインドウなら { if(((CWPSTRUCT *)lParam) -> message == WM_CREATE)//ウインドウ生成か? { GetWindowData(lParam); if(NULL != strstr(char_ClassName,"Notepad")) { //if(NULL != strstr(char_TitleName,"メモ帳")) { strcpy(char_SendString,"生成メモ帳"); char_HitFlag = 1; } } } if(((CWPSTRUCT *)lParam) -> message == WM_DESTROY)//ウインドウ破棄か? { GetWindowData(lParam); if(NULL != strstr(char_ClassName,"Notepad")) { if(NULL != strstr(char_TitleName,"メモ帳")) { strcpy(char_SendString,"破棄メモ帳"); char_HitFlag = 1; } } } }//if(GetParent(((CWPSTRUCT *)lParam) -> hwnd) == NULL) }//if(nCode == HC_ACTION) if(char_HitFlag == 1) { strcat(char_SendString,char_WH); g_struct_CDS.dwData = 0; g_struct_CDS.lpData = (void*)char_SendString; g_struct_CDS.cbData = lstrlen(char_SendString) + 1;//終端のNULLも送信 SendMessage(g_hwnd_EXEWH,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&g_struct_CDS); } return CallNextHookEx(g_hHookWnd,nCode,wParam,lParam);//次のフック } void GetWindowData(LPARAM lParam) { sprintf(char_WH,"%d",(((CWPSTRUCT *)lParam) -> hwnd)); GetClassName(((CWPSTRUCT *)lParam) -> hwnd,char_ClassName,256); GetWindowText(((CWPSTRUCT *)lParam) -> hwnd,char_TitleName,256); } __declspec(dllexport) void CALLBACK SetHook(HWND hwnd_EXEWH) { g_hwnd_EXEWH = hwnd_EXEWH; g_hHookWnd = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,hdll,0);//フック設定 } __declspec(dllexport) void CALLBACK FreeHook(void) { UnhookWindowsHookEx(g_hHookWnd);//フック解除 } '-------------------------------------------------- hook_test.def '-------------------------------------------------- LIBRARY hook_test EXPORTS SetHook FreeHook SECTIONS share_data READ WRITE SHARED UnhookWindowsHookExの戻り値は今から確認してみます。皆さんレスありがとうございます。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.