public static bool InstallHook() { wndProcDelegate = new WinAPI.WndProc(InjectedWndProc); IntPtr newWndProcPtr = Marshal.GetFunctionPointerForDelegate(wndProcDelegate); oldWndProcReference = WinAPI.SetWindowLong(GlobalState.SettlersWindowHandle, -4, (uint)newWndProcPtr); return(true); }
public static void Init() { if (!MahouUI.ENABLED) { return; } if (running) { bool exist = true; if (Environment.Is64BitOperatingSystem) { if (Process.GetProcessesByName("jkl").Length > 0) { Logging.Log("[JKL] > JKL already running."); } else { exist = false; } } else { if (Process.GetProcessesByName("jklx86").Length > 0) { Logging.Log("[JKL] > JKLx86 already running."); } else { exist = false; } } if (!exist) { Logging.Log("[JKL] > JKL seems closed, restarting..."); running = false; } } if (HWND == IntPtr.Zero) { Logging.Log("[JKL] > Initializing JKL HWND server..."); WNDPROC_DELEGATE = jklWndProc; var wnd_class = new WinAPI.WNDCLASS(); wnd_class.lpszClassName = "_XHIDDEN_HWND_SERVER"; wnd_class.lpfnWndProc = Marshal.GetFunctionPointerForDelegate(WNDPROC_DELEGATE); UInt16 cls_reg = WinAPI.RegisterClassW(ref wnd_class); int last_error = Marshal.GetLastWin32Error(); if (cls_reg == 0 && last_error != 0) { Logging.Log("[JKL] > Could not register window class, for jkl Hidden Server, err: " + last_error, 1); } HWND = WinAPI.CreateWindowExW(0, "_XHIDDEN_HWND_SERVER", "_XHIDDEN_HWND_SERVER", 0, 0, 0, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); Logging.Log("[JKL] > SERVER HWND: " + HWND); } if (!running) { if (jklExist()) { if (Environment.Is64BitOperatingSystem) { Logging.Log("[JKL] > Starting jkl.exe..."); var jkl = new ProcessStartInfo(); jkl.UseShellExecute = true; jkl.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "jkl.exe"); jkl.WorkingDirectory = Path.Combine(Path.GetTempPath()); Process.Start(jkl); } else { Logging.Log("[JKL] > Starting \"jklx86.exe -msg\"..."); var jkl = new ProcessStartInfo(); jkl.UseShellExecute = true; jkl.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "jklx86.exe"); jkl.Arguments = "-msg"; jkl.WorkingDirectory = Path.Combine(Path.GetTempPath()); Process.Start(jkl); } var umsgID = Path.Combine(Path.GetTempPath(), "umsg.id"); var tries = 0; while (!File.Exists(umsgID)) { Thread.Sleep(350); tries++; if (tries > 20) { Logging.Log("[JKL] > Error, umsg.id not found after 20 tries by 350 ms timeout.", 1); Destroy(); break; } } if (tries <= 20) { Logging.Log("[JKL] > umsg.id found, after " + tries + " tries * 350ms timeout."); Logging.Log("[JKL] > Retrieving umsg.id..."); jkluMSG = Int32.Parse(File.ReadAllText(umsgID)); File.Delete(umsgID); // KMHook.DoLater(() => CycleAllLayouts(Locales.ActiveWindow()), 350); KMHook.DoLater(() => { MahouUI.GlobalLayout = MahouUI.currentLayout = Locales.GetCurrentLocale(); }, 200); running = true; } } else { Logging.Log("[JKL] > " + jklInfoStr, 1); } if (jkluMSG == -1) { KMHook.JKLERR = true; } else { KMHook.JKLERR = false; } Logging.Log("[JKL] > Init done, umsg: [" + jkluMSG + "], JKLXServ: [" + HWND + "]."); } }