2 * PROJECT: ReactOS Keyboard Layout Switcher
3 * FILE: kbswitch/kbsdll/kbsdll.c
4 * PROGRAMMER: Dmitry Chapyshev <dmitry@reactos.org>
8 #include "../kbswitch.h"
10 HHOOK hKeyboardHook
, hLangHook
, hWinHook
;
15 SendMessageToMainWnd(UINT Msg
, WPARAM wParam
, LPARAM lParam
)
17 PostMessage(hKbSwitchWnd
, Msg
, wParam
, lParam
);
22 KeyboardHookProc(int code
, WPARAM wParam
, LPARAM lParam
)
24 return CallNextHookEx(hKeyboardHook
, code
, wParam
, lParam
);
28 LangHookProc(int code
, WPARAM wParam
, LPARAM lParam
)
35 case WM_INPUTLANGCHANGEREQUEST
:
37 SendMessageToMainWnd(WM_LANG_CHANGED
, wParam
, msg
->lParam
);
45 SendMessageToMainWnd(WM_LOAD_LAYOUT
, (WPARAM
)msg
->hwnd
, msg
->lParam
);
51 return CallNextHookEx(hLangHook
, code
, wParam
, lParam
);
55 WinHookProc(int code
, WPARAM wParam
, LPARAM lParam
)
57 int id
= GlobalAddAtom(_T("KBSWITCH"));
63 if ((HWND
)wParam
!= NULL
)
65 if ((HWND
)wParam
!= hKbSwitchWnd
)
67 SendMessageToMainWnd(WM_WINDOW_ACTIVATE
, wParam
, lParam
);
75 RegisterHotKey((HWND
)wParam
, id
, MOD_ALT
, VK_F10
);
81 UnregisterHotKey((HWND
)wParam
, id
);
88 return CallNextHookEx(hWinHook
, code
, wParam
, lParam
);
92 KbSwitchSetHooks(VOID
)
94 hKeyboardHook
= SetWindowsHookEx(WH_KEYBOARD
, KeyboardHookProc
, hInstance
, 0);
95 hLangHook
= SetWindowsHookEx(WH_GETMESSAGE
, LangHookProc
, hInstance
, 0);
96 hWinHook
= SetWindowsHookEx(WH_CBT
, WinHookProc
, hInstance
, 0);
98 if ((hKeyboardHook
)&&(hLangHook
)&&(hWinHook
))
105 KbSwitchDeleteHooks(VOID
)
107 if (hKeyboardHook
) UnhookWindowsHookEx(hKeyboardHook
);
108 if (hLangHook
) UnhookWindowsHookEx(hLangHook
);
109 if (hWinHook
) UnhookWindowsHookEx(hWinHook
);
113 DllMain(IN HINSTANCE hinstDLL
,
115 IN LPVOID lpvReserved
)
119 case DLL_PROCESS_ATTACH
:
120 hInstance
= hinstDLL
;
121 hKbSwitchWnd
= FindWindow(szKbSwitcherName
, NULL
);
122 if (!hKbSwitchWnd
) return FALSE
;