OSDN Git Service

makefile変更
[dokopop/dokopop.git] / DCHookTest / DCHookLoader.cpp
1 #include <windows.h>
2 #pragma hdrstop
3 #include <tchar.h>
4 #include <System.hpp>
5 #include "StringLib.h"
6 #include "DCHookLoader.h"
7 #include "HookLoader.h"
8 #include "Util.h"
9
10 // LoadHook()\82Íapplication\97§\82¿\8fã\82ª\82è\8e\9e\81A\82Ü\82½\82ÍConfiguration\8e\9e\82É\82P\89ñ\82¾\82¯\8cÄ\82Î\82ê\82é
11 // UnloadHook()\82ÍLoadHook()\82Æ\95K\82¸\91Î\82Å\8eg\97p\82·\82é
12
13 #define USE_HOOK64              1
14
15 #if USE_HOOK64
16 #define IsWow64()       (fWow64)
17 #else
18 #define IsWow64()       (false)
19 #endif
20
21 /// THookArray ///
22 THookArray::~THookArray()
23 {
24         clear();
25 }
26
27 bool THookArray::Load(HWND hwnd)
28 {
29         bool ret = true;
30         foreach(Hooks, it, hook_vec){
31                 if (!(*it)->Load(hwnd)){
32                         ret = false;
33                         break;
34                 }
35         }
36         return ret;
37 }
38 void THookArray::Unload()
39 {
40         foreach(Hooks, it, hook_vec){
41                 (*it)->Unload();
42         }
43 }
44 void THookArray::Uninit()
45 {
46         foreach(Hooks, it, hook_vec){
47                 (*it)->Uninit();
48         }
49 }
50 bool THookArray::Init(HWND hwnd)
51 {
52         DBW("HookArray::Init");
53         bool ret = true;
54 #if 0   // debug code
55         DBW("Init1"); Hooks[1]->Init(hwnd);     // 64bit
56         DBW("Init0"); Hooks[0]->Init(hwnd);     // 32bit
57 #else
58         foreach(Hooks, it, hook_vec){
59                 if (!(*it)->Init(hwnd)){
60                         ret = false;
61                 }
62         }
63 #endif
64         return ret;
65 }
66 void THookArray::Init32(HWND hwnd)
67 {
68         Hooks[0]->Init(hwnd);
69 }
70 int THookArray::Config( int clickonly, int keyaction, int keyflag )
71 {
72         foreach(Hooks, it, hook_vec){
73                 (*it)->Config(clickonly, keyaction, keyflag);
74         }
75         return 0;
76 }
77 int THookArray::Config2( struct TDCHConfig *cfg )
78 {
79         foreach(Hooks, it, hook_vec){
80                 (*it)->Config2(cfg);
81         }
82         return 0;
83 }
84 int THookArray::Capture()
85 {
86         int ret = 0;
87         foreach(Hooks, it, hook_vec){
88                 if ((*it)->Capture())
89                         ret = 1;
90         }
91         return ret;
92 }
93 int THookArray::CaptureAsync()
94 {
95         int ret = 0;
96         foreach(Hooks, it, hook_vec){
97                 if ((*it)->CaptureAsync())
98                         ret = 1;
99         }
100         return ret;
101 }
102 int THookArray::CaptureAsyncWait()
103 {
104         int ret = 0;
105         foreach(Hooks, it, hook_vec){
106                 int r = (*it)->CaptureAsyncWait();
107                 if (r!=0){
108                         ret = r;
109                         break;
110                 }
111         }
112         return ret;
113 }
114 int THookArray::Debug()
115 {
116         int ret = 0;
117         foreach(Hooks, it, hook_vec){
118                 int r = (*it)->Debug();
119                 if (r)
120                         ret = r;
121         }
122         return ret;
123 }
124
125 void THookArray::clear()
126 {
127         Uninit();
128         foreach(Hooks, it, hook_vec){
129                 delete *it;
130         }
131         Hooks.clear();
132 }
133
134 bool THookArray::IsLoaded()
135 {
136         if (Hooks.size()==0)
137                 return false;
138         return Hooks[0]->IsLoaded();
139 }
140
141 /// TDCHookLoader ///
142 TDCHookLoader::TDCHookLoader(bool use64)
143         :Use64(use64)
144 {
145         EnableSendAllKeys = false;
146         Hook64 = NULL;
147         Hook32 = NULL;
148         LoadPending = false;
149 }
150 #if !defined(DSKSVR) && !defined(DCHOOK)
151 void TDCHookLoader::SaveProfile(const tchar *param_string)
152 {
153         prof.WriteString(PFS_SHORTCUT, StrParams, param_string);
154 }
155
156 tnstr TDCHookLoader::LoadProfile()
157 {
158         return prof.ReadString(PFS_SHORTCUT, StrParams, _T(""));
159 }
160 #endif
161
162 bool TDCHookLoader::LoadHook( HWND hwndParent )
163 {
164         if (Hooks.IsLoaded() || LoadPending) return true;
165
166         if (Hooks.size()==0){
167                 Hooks.add(Hook32 = new THookLoader(NAME_DKPPHKDLL) );
168 #ifdef _DEBUG
169                 if (!DebugHook)
170 #endif
171                 {
172                         if (Use64 && IsWow64()){
173                                 Hooks.add(Hook64 = new THookLoader64(hwndParent));
174                         }
175                 }
176         }
177
178         if (!Hooks.Load(hwndParent)){
179                 DBW("Hooks.Load failed");
180                 return false;
181         }
182
183         if (Hook64 && Hook64->IsPending()){
184                 LoadPending = true;
185                 hwndSavedParent = hwndParent;
186                 return true;
187         }
188
189         LoadHookPost(hwndParent);
190
191         return true;
192 }
193
194 void TDCHookLoader::LoadHookPost(HWND hwndParent)
195 {
196         Hooks.Init(hwndParent);
197 #if 0
198         int num = LoadKeyProfiles();
199         if ( num > 0 || EnableSendAllKeys ){
200                 if ( !Hooks.InitHook( hwndParent, UM_SHORTCUT ) ){
201                         num = 0;
202                 }
203         }
204
205 #if !defined(DSKSVR) && !defined(DCHOOK)
206         //Note: SendAllKeys\82ð\97L\8cø\82É\82·\82é\82Æ32bitApp\8fã\82Å\93ñ\8fd\82É\83C\83x\83\93\83g\82ª\91\97\82ç\82ê\82Ä\82­\82é\81B\81i\8c´\88ö\95s\96¾\81j
207         // \82»\82Ì\82½\82ß\82±\82Ì\90Ý\92è\82¾\82¯\82Í32bit\91¤\82¾\82¯\97L\8cø\82É\82·\82é\81B
208         // \81i64bitApp\8fã\82Å\82Í\93ñ\8fd\82É\82È\82ç\82È\82¢\81j
209         // \82È\82¨\81A64bitHook\82¾\82¯\82ðload\82µ\82½\8fê\8d\87\82Í\83C\83x\83\93\83g\82ª\82Ü\82Á\82½\82­\82±\82È\82­\82È\82é\81i\82±\82ê\82à\8c´\88ö\95s\96¾\81j
210         if (Hook32)
211                 Hook32->Add( NULL, EnableSendAllKeys, FUNC_SENDALLKEYS );
212 #endif
213
214         if ( num == 0 && !EnableSendAllKeys ){
215                 Hooks.Unload();
216         }
217 #endif
218 }
219
220 void TDCHookLoader::UnloadHook()
221 {
222         LoadPending = false;
223         if (!Hooks.IsLoaded()){
224                 return;
225         }
226         //Hooks.FinishHook();
227         Hooks.Uninit();
228         Hooks.Unload();
229         //if ( fWindowsNT )
230         {
231 #if 1   // \82µ\82Î\82ç\82­\82Í\82±\82Á\82¿\82Ì\95û\96@(C++Builder\82ª\91Î\89\9e\82µ\82Ä\82¢\82È\82¢ - \82Æ\82¢\82¤\82©\81AMS\82Ìbug\82Å\82¤\82Ü\82­link\82Å\82«\82È\82¢)
232                 typedef long (WINAPI *FNBroadcastSystemMessage)
233                         (DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);
234                 HINSTANCE hDll = LoadLibrary( _T("user32") );
235                 if ( hDll ){
236                         FNBroadcastSystemMessage _BroadcastSystemMessage = (FNBroadcastSystemMessage)GetProcAddress( hDll, "BroadcastSystemMessage");
237                         if ( _BroadcastSystemMessage ){
238                                 UINT msg = RegisterWindowMessage( _T("wmBroadcastForUnhook") );
239                                 if ( msg ){
240                                         DWORD receipt = BSM_APPLICATIONS;
241                                         _BroadcastSystemMessage( BSF_POSTMESSAGE, &receipt, msg, 0, 0 );        // Win95\82Å\82Ísupport\82³\82ê\82Ä\82¢\82È\82¢\8aÖ\90\94
242                                 }
243                         }
244                         FreeLibrary( hDll );
245                 }
246 #else
247                 UINT msg = RegisterWindowMessage( "wmBroadcastForUnhook" );
248                 DWORD receipt = BSM_APPLICATIONS;
249                 BroadcastSystemMessage( BSF_POSTMESSAGE, &receipt, msg, 0, 0 ); // Win95\82Å\82Ísupport\82³\82ê\82Ä\82¢\82È\82¢\8aÖ\90\94
250 #endif
251         }
252 }
253
254 void TDCHookLoader::Config( int clickonly, int keyaction, int keyflag )
255 {
256         Hooks.Config(clickonly, keyaction, keyflag);
257 }
258 void TDCHookLoader::Config2( struct TDCHConfig *cfg )
259 {
260         Hooks.Config2(cfg);
261 }
262
263 void TDCHookLoader::Capture()
264 {
265         Hooks.Capture();
266 }
267 void TDCHookLoader::CaptureAsync()
268 {
269         Hooks.CaptureAsync();
270 }
271 void TDCHookLoader::CaptureAsyncWait()
272 {
273         Hooks.CaptureAsyncWait();
274 }
275 void TDCHookLoader::Init32(HWND hwnd)
276 {
277         Hooks.Init32(hwnd);
278 }
279
280 void TDCHookLoader::Notify64(LPARAM lParam)
281 {
282         DBW("Notify64 : lParam=%08X Hook64=%08X", lParam, Hook64);
283         if (!Hook64 || !lParam)
284                 return;
285         Hook64->Notify64();
286         Hook64->SetTarget((HWND)lParam);
287         if (LoadPending){
288                 LoadHookPost(hwndSavedParent);
289                 LoadPending = false;
290         }
291 }
292