diff --git a/base/applications/kbswitch/CMakeLists.txt b/base/applications/kbswitch/CMakeLists.txt index 9cf01e40398..3c42fcd7283 100644 --- a/base/applications/kbswitch/CMakeLists.txt +++ b/base/applications/kbswitch/CMakeLists.txt @@ -2,7 +2,8 @@ add_rc_deps(kbswitch.rc ${CMAKE_CURRENT_SOURCE_DIR}/res/kbswitch.ico) add_executable(kbswitch kbswitch.c kbswitch.rc) set_module_type(kbswitch win32gui UNICODE) -add_importlibs(kbswitch advapi32 imm32 user32 shell32 shlwapi gdi32 msvcrt kernel32) +target_link_libraries(kbswitch wine) +add_importlibs(kbswitch advapi32 imm32 user32 shell32 shlwapi gdi32 msvcrt kernel32 ntdll) add_cd_file(TARGET kbswitch DESTINATION reactos/system32 FOR all) add_subdirectory(kbsdll) diff --git a/base/applications/kbswitch/kbsdll/kbsdll.spec b/base/applications/kbswitch/kbsdll/kbsdll.spec index 46a5a52f32a..e878227c085 100644 --- a/base/applications/kbswitch/kbsdll/kbsdll.spec +++ b/base/applications/kbswitch/kbsdll/kbsdll.spec @@ -1,2 +1,2 @@ -@ stdcall KbSwitchSetHooks() -@ stdcall KbSwitchDeleteHooks() +1 stdcall KbSwitchSetHooks() +2 stdcall KbSwitchDeleteHooks() diff --git a/base/applications/kbswitch/kbswitch.c b/base/applications/kbswitch/kbswitch.c index 9487956bc9d..f111263e947 100644 --- a/base/applications/kbswitch/kbswitch.c +++ b/base/applications/kbswitch/kbswitch.c @@ -13,6 +13,9 @@ #include #include +#include +WINE_DEFAULT_DEBUG_CHANNEL(internat); + /* * This program kbswitch is a mimic of Win2k's internat.exe. * However, there are some differences. @@ -561,15 +564,19 @@ SetHooks(VOID) return FALSE; } - KbSwitchSetHooks = (PKBSWITCHSETHOOKS) GetProcAddress(g_hHookDLL, "KbSwitchSetHooks"); - KbSwitchDeleteHooks = (PKBSWITCHDELETEHOOKS) GetProcAddress(g_hHookDLL, "KbSwitchDeleteHooks"); +#define IHOOK_SET 1 +#define IHOOK_DELETE 2 + KbSwitchSetHooks = (PKBSWITCHSETHOOKS) GetProcAddress(g_hHookDLL, MAKEINTRESOURCEA(IHOOK_SET)); + KbSwitchDeleteHooks = (PKBSWITCHDELETEHOOKS) GetProcAddress(g_hHookDLL, MAKEINTRESOURCEA(IHOOK_DELETE)); - if (KbSwitchSetHooks == NULL || KbSwitchDeleteHooks == NULL) + if (!KbSwitchSetHooks || !KbSwitchDeleteHooks || !KbSwitchSetHooks()) { + ERR("SetHooks failed\n"); return FALSE; } - return KbSwitchSetHooks(); + TRACE("SetHooks OK\n"); + return TRUE; } VOID @@ -580,11 +587,14 @@ DeleteHooks(VOID) KbSwitchDeleteHooks(); KbSwitchDeleteHooks = NULL; } + if (g_hHookDLL) { FreeLibrary(g_hHookDLL); g_hHookDLL = NULL; } + + TRACE("DeleteHooks OK\n"); } static UINT GetLayoutNum(HKL hKL) @@ -704,6 +714,7 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) case WM_LANG_CHANGED: /* Comes from kbsdll.dll and this module */ { + TRACE("WM_LANG_CHANGED: wParam:%p, lParam:%p\n", wParam, lParam); UpdateLayoutList((HKL)lParam); UpdateLanguageDisplay(hwnd, (HKL)lParam); break; @@ -711,7 +722,9 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) case WM_WINDOW_ACTIVATE: /* Comes from kbsdll.dll and this module */ { - HWND hwndFore = GetForegroundWindow(); + HWND hwndFore; + TRACE("WM_WINDOW_ACTIVATE: wParam:%p, lParam:%p\n", wParam, lParam); + hwndFore = GetForegroundWindow(); if (RememberLastActive(hwnd, hwndFore)) return UpdateLanguageDisplayCurrent(hwnd, hwndFore); break; @@ -856,6 +869,7 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) } else if (Message == ShellHookMessage) { + TRACE("ShellHookMessage: wParam:%p, lParam:%p\n", wParam, lParam); if (wParam == HSHELL_LANGUAGE) PostMessage(hwnd, WM_LANG_CHANGED, wParam, lParam); else if (wParam == HSHELL_WINDOWACTIVATED) @@ -881,6 +895,7 @@ _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSh switch (GetUserDefaultUILanguage()) { case MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT): + TRACE("LAYOUT_RTL\n"); SetProcessDefaultLayout(LAYOUT_RTL); break; default: @@ -889,10 +904,14 @@ _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSh hMutex = CreateMutex(NULL, FALSE, szKbSwitcherName); if (!hMutex) + { + ERR("!hMutex\n"); return 1; + } if (GetLastError() == ERROR_ALREADY_EXISTS) { + ERR("Another instance is already running\n"); CloseHandle(hMutex); return 1; } @@ -913,7 +932,13 @@ _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSh hwnd = CreateWindow(szKbSwitcherName, NULL, 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInstance, NULL); ShellHookMessage = RegisterWindowMessage(L"SHELLHOOK"); - RegisterShellHookWindow(hwnd); + if (!RegisterShellHookWindow(hwnd)) + { + ERR("RegisterShellHookWindow failed\n"); + DestroyWindow(hwnd); + CloseHandle(hMutex); + return 1; + } while (GetMessage(&msg, NULL, 0, 0)) {