先日の質問「C#よりDLL(C++)を使用し、グローバルフック をおこないたい」
https://teratail.com/questions/142061
にて各32/64BitのEXEから対応する32/64Bitのプロセスへグローバルフックを
おこなうことができました。
上記の作業中の調査過程で、見つけたHP
monoの開発ブログ
64bit対応なフックを使ったアプリの作り方
https://blog.mono0x.net/blog/2009/09/13/64bit-hook/
のコメント欄に記載されていた
「32ビットのプロセスで64ビットプロセスのフックは可能です。
私の場合は下層レベルキーボードフックを32ビットプログラムで仕掛け、
64ビット版のcmd.exeのキー操作を制限しています。
勿論、フックプロシージャは自プロセスのインスタンス内にあります。
64ビット版も作りましたが、同じ方法でフックできています。
ある工夫とはメッセージループです。メインスレッドでフックを仕掛け、
同じスレッドでメッセージループを開始すればフックは機能します。」
WEB上の検索でも、呼び出し元のEXEとフック先のビット数を一致させるか方法か、
読みだし元のEXEのコンパイルをAnyCPUにし、OSやフック先のアプリのビット数に合わせて
フック制御用のDLL動的に読み込ませてフックを行う方法の2種類が主のようなのですが
メッセージループを使用するケースに関しては、具体的なコードを見つけることができませんでした。
メッセージループを使用すれば、わざわざ2種類のEXEとDLLを作成せずに
32Bitプロセスから64Bitのアプリを直接制御できるようなのですが、
どなたかご存知の方はいらっしゃらないでしょうか?
宜しくお願い致します。
追加記載
キーボードのグローバルフックですが、同じようなことをしている記事を
見つけましたので、URL等を追記します。
https://stackoverflow.com/questions/15542783/global-keyhook-on-64-bit-windows
ただ上記記事を元に、コードを修正してみましたがまだ動きません。
32BitExeから32BitDLL=>32Bitプロセスへフックはかかりますが、解除が動きません。
32BitExeから32BitDLL=>64Bitプロセスへは、フック事態が動きません。
引き続き調べてみたいと思います。
再度追加記載
一部コードを変更しました。
変更により「UnCloseHook32_MsgLoop」から「CloseHook32_MsgLoop」を呼び出しでの終了を行えました。
が「UnhookWindowsHookEx(hHwnd)」がエラーを返却するため、フックを解除できません。
C++
1// 共有領域(共有領域のデータは初期化してないとうまく確保されない) 2#pragma data_seg("share") 3HHOOK hHookWnd = NULL; 4HINSTANCE hdll = NULL; 5HWND hTarget = NULL; 6volatile static bool runHooked = false; 7#pragma data_seg() 8 9// フックを組み込む 10int CALLBACK CloseHook32_MsgLoop(HWND HandleofTarget) 11{ 12 if(hdll == NULL) return 99; 13 hTarget = HandleofTarget; 14 HHOOK hHwnd=SetWindowsHookEx(WH_CBT,(HOOKPROC)CallWndProc, hdll, 0); 15 16 if(hHwnd == NULL) 17 { 18 return 100; 19 } 20 21 MSG msg; 22 runHooked = true; 23 //Loop 24 while(runHooked) 25 { 26 if( PeekMessage(&msg, nullptr, 0, 0, PM_NOREMOVE)) 27 { 28 if (GetMessage(&msg, NULL, 0, 0) > 0) 29 { // GetMessageでPeekMessageで確認したメッセージを取得. 30 TranslateMessage(&msg); 31 DispatchMessage(&msg); 32 Sleep(10); 33 } 34 else 35 { 36 break; 37 } 38 } 39 } 40 41 int ans = UnhookWindowsHookEx(hHwnd); 42 43 hHwnd = NULL; 44 45 if(ans == 0) 46 { 47 return ans; 48 } 49 else 50 { 51 return ans; 52 } 53} 54 55 56void CALLBACK UnCloseHook32_MsgLoop(void) 57{ 58 runHooked=false; 59}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/28 00:35