调用FindWindowW("Progman", "Program Manager") 总是返回一个空句柄
我在使用koffi库从TypeScript调用Win32 API。但是,我卡在第一步:FindWindowW一直返回0(NULL),这表示找不到Progman窗口。下面是代码的部分片段:
const FindWindowW = user32.func("int FindWindowW(str lpClassNmae, str lpWindowName)");
export function attachToWallpaper(targetHwnd: number | bigint) {
// 步骤 1: 找到桌面顶层管理器 Progman
const progman = FindWindowW('Progman', "Program Manager");
console.log('Progman:', progman);
if (progman === 0) {
console.error('X Couldn\'t find Progman window');
return false;
}
// 步骤 2: 发送 0x052C 消息
const resultPtr = koffi.alloc('int', koffi.sizeof('int'));
SendMessageTimeoutW(progman, WM_SPAWN_WORKERW, 0, 0, SMTO_NORMAL, 1000, resultPtr);
koffi.free(resultPtr);
}
解决方案
你的代码存在三个问题:
FindWindowW需要UTF-16编码的wchar_t字符串,但koffi将str映射为UTF-8编码的char字符串。请改用str16、char16_t或wchar_t。- 大多数Windows API(包括
FindWindowW)使用stdcall调用约定,而koffi默认为cdecl。你必须显式使用stdcall。 FindWindowW的返回值是一个HWND,它是一个指针类型。指针在32位和64位系统上大小不同。对于64位系统,int不足以保存指针。请改用uintptr或void*。你也可以可选地使用koffi.alias('HWND', 'void *')或koffi.opaque(),让在后续代码中使用HWND更加清晰。但无论你决定使用哪种类型,请务必在你的其他Win32函数声明中也使用相同的类型,例如SendMessageTimeoutW。
可以试试下面这样的写法:
const HWND = koffi.alias('HWND', 'void *');
const FindWindowW = user32.func("HWND __stdcall FindWindowW(const wchar_t *lpClassNmae, const wchar_t *lpWindowName)");
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。