From 9f51472ca5a78dce60fa78a48a08db5048b9ac40 Mon Sep 17 00:00:00 2001 From: Pascal Boutin Date: Tue, 3 Sep 2024 10:27:01 -0400 Subject: [PATCH] Set the windows adapter as the default one --- src/electron/dofus-windows-adapters/active.js | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/electron/dofus-windows-adapters/active.js diff --git a/src/electron/dofus-windows-adapters/active.js b/src/electron/dofus-windows-adapters/active.js new file mode 100644 index 0000000..06fe1d6 --- /dev/null +++ b/src/electron/dofus-windows-adapters/active.js @@ -0,0 +1,47 @@ +import koffi from 'koffi'; + +const user32 = koffi.load('user32.dll'); + +const FindWindowA = user32.func('__stdcall', 'FindWindowA', 'int', ['str', 'str']); + +const SwitchToThisWindow = user32.func('__stdcall', 'SwitchToThisWindow', 'void', ['int', 'bool']); + +const WNDENUMPROC = koffi.proto('bool __stdcall WNDENUMPROC(void *hwnd, intptr_t lparam)'); +const EnumWindows = user32.func('bool EnumWindows(WNDENUMPROC *func, intptr_t lparam)'); + +const HANDLE = koffi.pointer('HANDLE', koffi.opaque()); +const HWND = koffi.alias('HWND', HANDLE); +const GetWindowText = user32.func('int __stdcall GetWindowTextA(HWND hWnd, _Out_ uint8_t *lpString, int nMaxCount)'); + +const listDofusWindows = () => { + const dofusClients = []; + + EnumWindows((hwnd, lparam) => { + let buf = Buffer.allocUnsafe(1024); + GetWindowText(hwnd, buf, buf.length); + const windowName = koffi.decode(buf, 'char', 100); + + const match = windowName.match(/(.+) - Dofus 2\./); + if (match) { + dofusClients.push({ + windowName, + character: match[1], + }); + } + return true; + }, 100); + + return dofusClients; +}; + +const focusDofusWindow = (characterToFocus) => { + const dofusWindows = listDofusWindows(); + + const characterWindow = dofusWindows.find(({ character }) => character === characterToFocus); + if (!characterWindow) return; + + const hwnd = FindWindowA(null, characterWindow.windowName); + SwitchToThisWindow(hwnd, false); +}; + +export default { listDofusWindows, focusDofusWindow };