質問するログイン新規登録

質問編集履歴

4

コード修正

2018/08/27 05:31

投稿

trons
trons

スコア20

title CHANGED
File without changes
body CHANGED
@@ -38,17 +38,21 @@
38
38
  32BitExeから32BitDLL=>64Bitプロセスへは、フック事態が動きません。
39
39
  引き続き調べてみたいと思います。
40
40
 
41
+ 再度追加記載
42
+ 一部コードを変更しました。
43
+ 変更により「UnCloseHook32_MsgLoop」から「CloseHook32_MsgLoop」を呼び出しでの終了を行えました。
44
+ が「UnhookWindowsHookEx(hHwnd)」がエラーを返却するため、フックを解除できません。
45
+
46
+
41
47
  ```C++
42
48
  // 共有領域(共有領域のデータは初期化してないとうまく確保されない)
43
49
  #pragma data_seg("share")
44
50
  HHOOK hHookWnd = NULL;
45
51
  HINSTANCE hdll = NULL;
46
52
  HWND hTarget = NULL;
47
- volatile static bool runHooked = false; //<=現状共有領域でも正常にUnHookができない
53
+ volatile static bool runHooked = false; 
48
54
  #pragma data_seg()
49
55
 
50
-
51
- volatile static bool runHooked = false; //<=ここでもだめ
52
56
  // フックを組み込む
53
57
  int CALLBACK CloseHook32_MsgLoop(HWND HandleofTarget)
54
58
  {
@@ -63,13 +67,22 @@
63
67
 
64
68
  MSG msg;
65
69
  runHooked = true;
66
- while(runHooked) { //メッセージループ(ポンプ)
67
- // Keep pumping...
70
+ //Loop
71
+ while(runHooked)
72
+ {
68
- PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
73
+ if( PeekMessage(&msg, nullptr, 0, 0, PM_NOREMOVE))
74
+ {
75
+ if (GetMessage(&msg, NULL, 0, 0) > 0)
76
+ { // GetMessageでPeekMessageで確認したメッセージを取得.
69
- TranslateMessage(&msg);
77
+ TranslateMessage(&msg);
70
- DispatchMessage(&msg);
78
+ DispatchMessage(&msg);
71
-
72
- Sleep(10);
79
+ Sleep(10);
80
+ }
81
+ else
82
+ {
83
+ break;
84
+ }
85
+ }
73
86
  }
74
87
 
75
88
  int ans = UnhookWindowsHookEx(hHwnd);

3

間違いを見つけた

2018/08/27 05:31

投稿

trons
trons

スコア20

title CHANGED
File without changes
body CHANGED
@@ -62,7 +62,7 @@
62
62
  }
63
63
 
64
64
  MSG msg;
65
- runHooked = false;
65
+ runHooked = true;
66
66
  while(runHooked) { //メッセージループ(ポンプ)
67
67
  // Keep pumping...
68
68
  PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
@@ -89,6 +89,6 @@
89
89
 
90
90
  void CALLBACK UnCloseHook32_MsgLoop(void)
91
91
  {
92
- runHooked=true;
92
+ runHooked=false;
93
93
  }
94
94
  ```

2

デバック時のコードだった

2018/08/27 05:09

投稿

trons
trons

スコア20

title CHANGED
File without changes
body CHANGED
@@ -62,7 +62,7 @@
62
62
  }
63
63
 
64
64
  MSG msg;
65
- runHooked = true;
65
+ runHooked = false;
66
66
  while(runHooked) { //メッセージループ(ポンプ)
67
67
  // Keep pumping...
68
68
  PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);

1

情報の追記

2018/08/27 05:09

投稿

trons
trons

スコア20

title CHANGED
File without changes
body CHANGED
@@ -26,4 +26,69 @@
26
26
  32Bitプロセスから64Bitのアプリを直接制御できるようなのですが、
27
27
  どなたかご存知の方はいらっしゃらないでしょうか?
28
28
 
29
- 宜しくお願い致します。
29
+ 宜しくお願い致します。
30
+
31
+ 追加記載
32
+ キーボードのグローバルフックですが、同じようなことをしている記事を
33
+ 見つけましたので、URL等を追記します。
34
+ https://stackoverflow.com/questions/15542783/global-keyhook-on-64-bit-windows
35
+
36
+ ただ上記記事を元に、コードを修正してみましたがまだ動きません。
37
+ 32BitExeから32BitDLL=>32Bitプロセスへフックはかかりますが、解除が動きません。
38
+ 32BitExeから32BitDLL=>64Bitプロセスへは、フック事態が動きません。
39
+ 引き続き調べてみたいと思います。
40
+
41
+ ```C++
42
+ // 共有領域(共有領域のデータは初期化してないとうまく確保されない)
43
+ #pragma data_seg("share")
44
+ HHOOK hHookWnd = NULL;
45
+ HINSTANCE hdll = NULL;
46
+ HWND hTarget = NULL;
47
+ volatile static bool runHooked = false; //<=現状共有領域でも正常にUnHookができない
48
+ #pragma data_seg()
49
+
50
+
51
+ volatile static bool runHooked = false; //<=ここでもだめ
52
+ // フックを組み込む
53
+ int CALLBACK CloseHook32_MsgLoop(HWND HandleofTarget)
54
+ {
55
+ if(hdll == NULL) return 99;
56
+ hTarget = HandleofTarget;
57
+ HHOOK hHwnd=SetWindowsHookEx(WH_CBT,(HOOKPROC)CallWndProc, hdll, 0);
58
+
59
+ if(hHwnd == NULL)
60
+ {
61
+ return 100;
62
+ }
63
+
64
+ MSG msg;
65
+ runHooked = true;
66
+ while(runHooked) { //メッセージループ(ポンプ)
67
+ // Keep pumping...
68
+ PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
69
+ TranslateMessage(&msg);
70
+ DispatchMessage(&msg);
71
+
72
+ Sleep(10);
73
+ }
74
+
75
+ int ans = UnhookWindowsHookEx(hHwnd);
76
+
77
+ hHwnd = NULL;
78
+
79
+ if(ans == 0)
80
+ {
81
+ return ans;
82
+ }
83
+ else
84
+ {
85
+ return ans;
86
+ }
87
+ }
88
+
89
+
90
+ void CALLBACK UnCloseHook32_MsgLoop(void)
91
+ {
92
+ runHooked=true;
93
+ }
94
+ ```