调用FindWindowW("Progman", "Program Manager") 总是返回一个空句柄

前端开发 2026-07-09

我在使用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);


}

解决方案

你的代码存在三个问题:

  1. FindWindowW 需要UTF-16编码的 wchar_t 字符串,但koffi将 str 映射为UTF-8编码的 char 字符串。请改用 str16char16_twchar_t
  2. 大多数Windows API(包括 FindWindowW)使用 stdcall 调用约定,而koffi默认为 cdecl。你必须显式使用 stdcall
  3. FindWindowW 的返回值是一个 HWND,它是一个指针类型。指针在32位和64位系统上大小不同。对于64位系统,int 不足以保存指针。请改用 uintptrvoid*。你也可以可选地使用 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章