[SHELL32] Fix Control_RunDLLW (#5400)
[reactos.git] / base / applications / kbswitch / kbsdll / kbsdll.c
1 /*
2 * PROJECT: ReactOS Keyboard Layout Switcher
3 * FILE: base/applications/kbswitch/kbsdll/kbsdll.c
4 * PROGRAMMER: Dmitry Chapyshev <dmitry@reactos.org>
5 *
6 */
7
8 #include "../kbswitch.h"
9
10 HHOOK hWinHook = NULL;
11 HHOOK hShellHook = NULL;
12 HINSTANCE hInstance = NULL;
13 HWND hKbSwitchWnd = NULL;
14
15 static VOID
16 PostMessageToMainWnd(UINT Msg, WPARAM wParam, LPARAM lParam)
17 {
18 PostMessage(hKbSwitchWnd, Msg, wParam, lParam);
19 }
20
21 LRESULT CALLBACK
22 WinHookProc(int code, WPARAM wParam, LPARAM lParam)
23 {
24 if (code < 0)
25 {
26 return CallNextHookEx(hWinHook, code, wParam, lParam);
27 }
28
29 switch (code)
30 {
31 case HCBT_SETFOCUS:
32 {
33 HWND hwndFocus = (HWND)wParam;
34 if (hwndFocus && hwndFocus != hKbSwitchWnd)
35 {
36 PostMessageToMainWnd(WM_WINDOW_ACTIVATE, wParam, lParam);
37 }
38 }
39 break;
40 }
41
42 return CallNextHookEx(hWinHook, code, wParam, lParam);
43 }
44
45 LRESULT CALLBACK
46 ShellHookProc(int code, WPARAM wParam, LPARAM lParam)
47 {
48 if (code < 0)
49 {
50 return CallNextHookEx(hShellHook, code, wParam, lParam);
51 }
52
53 switch (code)
54 {
55 case HSHELL_LANGUAGE:
56 {
57 PostMessageToMainWnd(WM_LANG_CHANGED, wParam, lParam);
58 }
59 break;
60 }
61
62 return CallNextHookEx(hShellHook, code, wParam, lParam);
63 }
64
65 BOOL WINAPI
66 KbSwitchSetHooks(VOID)
67 {
68 hWinHook = SetWindowsHookEx(WH_CBT, WinHookProc, hInstance, 0);
69 hShellHook = SetWindowsHookEx(WH_SHELL, ShellHookProc, hInstance, 0);
70
71 if (!hWinHook || !hShellHook)
72 {
73 return FALSE;
74 }
75
76 return TRUE;
77 }
78
79 VOID WINAPI
80 KbSwitchDeleteHooks(VOID)
81 {
82 if (hWinHook)
83 {
84 UnhookWindowsHookEx(hWinHook);
85 hWinHook = NULL;
86 }
87 if (hShellHook)
88 {
89 UnhookWindowsHookEx(hShellHook);
90 hShellHook = NULL;
91 }
92 }
93
94 BOOL WINAPI
95 DllMain(IN HINSTANCE hinstDLL,
96 IN DWORD dwReason,
97 IN LPVOID lpvReserved)
98 {
99 switch (dwReason)
100 {
101 case DLL_PROCESS_ATTACH:
102 {
103 hInstance = hinstDLL;
104 hKbSwitchWnd = FindWindow(szKbSwitcherName, NULL);
105 if (!hKbSwitchWnd)
106 {
107 return FALSE;
108 }
109 }
110 break;
111 }
112
113 return TRUE;
114 }