質問編集履歴

4

コード修正

2018/08/27 05:31

投稿

trons
trons

スコア20

test CHANGED
File without changes
test CHANGED
@@ -78,6 +78,18 @@
78
78
 
79
79
 
80
80
 
81
+ 再度追加記載
82
+
83
+ 一部コードを変更しました。
84
+
85
+ 変更により「UnCloseHook32_MsgLoop」から「CloseHook32_MsgLoop」を呼び出しでの終了を行えました。
86
+
87
+ が「UnhookWindowsHookEx(hHwnd)」がエラーを返却するため、フックを解除できません。
88
+
89
+
90
+
91
+
92
+
81
93
  ```C++
82
94
 
83
95
  // 共有領域(共有領域のデータは初期化してないとうまく確保されない)
@@ -90,16 +102,12 @@
90
102
 
91
103
  HWND hTarget = NULL;
92
104
 
93
- volatile static bool runHooked = false; //<=現状共有領域でも正常にUnHookができない
105
+ volatile static bool runHooked = false; 
94
106
 
95
107
  #pragma data_seg()
96
108
 
97
109
 
98
110
 
99
-
100
-
101
- volatile static bool runHooked = false; //<=ここでもだめ
102
-
103
111
  // フックを組み込む
104
112
 
105
113
  int CALLBACK CloseHook32_MsgLoop(HWND HandleofTarget)
@@ -128,19 +136,37 @@
128
136
 
129
137
  runHooked = true;
130
138
 
131
- while(runHooked) { //メッセージループ(ポンプ)
132
-
133
- // Keep pumping...
139
+ //Loop
140
+
134
-
141
+ while(runHooked)
142
+
143
+ {
144
+
135
- PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
145
+ if( PeekMessage(&msg, nullptr, 0, 0, PM_NOREMOVE))
146
+
136
-
147
+ {
148
+
149
+ if (GetMessage(&msg, NULL, 0, 0) > 0)
150
+
151
+ { // GetMessageでPeekMessageで確認したメッセージを取得.
152
+
137
- TranslateMessage(&msg);
153
+ TranslateMessage(&msg);
138
-
154
+
139
- DispatchMessage(&msg);
155
+ DispatchMessage(&msg);
140
-
141
-
142
-
156
+
143
- Sleep(10);
157
+ Sleep(10);
158
+
159
+ }
160
+
161
+ else
162
+
163
+ {
164
+
165
+ break;
166
+
167
+ }
168
+
169
+ }
144
170
 
145
171
  }
146
172
 

3

間違いを見つけた

2018/08/27 05:31

投稿

trons
trons

スコア20

test CHANGED
File without changes
test CHANGED
@@ -126,7 +126,7 @@
126
126
 
127
127
  MSG msg;
128
128
 
129
- runHooked = false;
129
+ runHooked = true;
130
130
 
131
131
  while(runHooked) { //メッセージループ(ポンプ)
132
132
 
@@ -180,7 +180,7 @@
180
180
 
181
181
  {
182
182
 
183
- runHooked=true;
183
+ runHooked=false;
184
184
 
185
185
  }
186
186
 

2

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

2018/08/27 05:09

投稿

trons
trons

スコア20

test CHANGED
File without changes
test CHANGED
@@ -126,7 +126,7 @@
126
126
 
127
127
  MSG msg;
128
128
 
129
- runHooked = true;
129
+ runHooked = false;
130
130
 
131
131
  while(runHooked) { //メッセージループ(ポンプ)
132
132
 

1

情報の追記

2018/08/27 05:09

投稿

trons
trons

スコア20

test CHANGED
File without changes
test CHANGED
@@ -55,3 +55,133 @@
55
55
 
56
56
 
57
57
  宜しくお願い致します。
58
+
59
+
60
+
61
+ 追加記載
62
+
63
+ キーボードのグローバルフックですが、同じようなことをしている記事を
64
+
65
+ 見つけましたので、URL等を追記します。
66
+
67
+ https://stackoverflow.com/questions/15542783/global-keyhook-on-64-bit-windows
68
+
69
+
70
+
71
+ ただ上記記事を元に、コードを修正してみましたがまだ動きません。
72
+
73
+ 32BitExeから32BitDLL=>32Bitプロセスへフックはかかりますが、解除が動きません。
74
+
75
+ 32BitExeから32BitDLL=>64Bitプロセスへは、フック事態が動きません。
76
+
77
+ 引き続き調べてみたいと思います。
78
+
79
+
80
+
81
+ ```C++
82
+
83
+ // 共有領域(共有領域のデータは初期化してないとうまく確保されない)
84
+
85
+ #pragma data_seg("share")
86
+
87
+ HHOOK hHookWnd = NULL;
88
+
89
+ HINSTANCE hdll = NULL;
90
+
91
+ HWND hTarget = NULL;
92
+
93
+ volatile static bool runHooked = false; //<=現状共有領域でも正常にUnHookができない
94
+
95
+ #pragma data_seg()
96
+
97
+
98
+
99
+
100
+
101
+ volatile static bool runHooked = false; //<=ここでもだめ
102
+
103
+ // フックを組み込む
104
+
105
+ int CALLBACK CloseHook32_MsgLoop(HWND HandleofTarget)
106
+
107
+ {
108
+
109
+ if(hdll == NULL) return 99;
110
+
111
+ hTarget = HandleofTarget;
112
+
113
+ HHOOK hHwnd=SetWindowsHookEx(WH_CBT,(HOOKPROC)CallWndProc, hdll, 0);
114
+
115
+
116
+
117
+ if(hHwnd == NULL)
118
+
119
+ {
120
+
121
+ return 100;
122
+
123
+ }
124
+
125
+
126
+
127
+ MSG msg;
128
+
129
+ runHooked = true;
130
+
131
+ while(runHooked) { //メッセージループ(ポンプ)
132
+
133
+ // Keep pumping...
134
+
135
+ PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
136
+
137
+ TranslateMessage(&msg);
138
+
139
+ DispatchMessage(&msg);
140
+
141
+
142
+
143
+ Sleep(10);
144
+
145
+ }
146
+
147
+
148
+
149
+ int ans = UnhookWindowsHookEx(hHwnd);
150
+
151
+
152
+
153
+ hHwnd = NULL;
154
+
155
+
156
+
157
+ if(ans == 0)
158
+
159
+ {
160
+
161
+ return ans;
162
+
163
+ }
164
+
165
+ else
166
+
167
+ {
168
+
169
+ return ans;
170
+
171
+ }
172
+
173
+ }
174
+
175
+
176
+
177
+
178
+
179
+ void CALLBACK UnCloseHook32_MsgLoop(void)
180
+
181
+ {
182
+
183
+ runHooked=true;
184
+
185
+ }
186
+
187
+ ```