kihlh / hmc-win32

HMC Easier Access to System APIs 简化连接winapi的过程的node c++模块
https://kihlh.gitbook.io/hmc/
MIT License
85 stars 11 forks source link

chrome的句柄操作不了 #2

Closed wuchuguang closed 1 year ago

wuchuguang commented 1 year ago

用puppeteer打开后,通过pid获取handle后,SetTitle无效,均返回false

kihlh commented 1 year ago

使用窗口工具 获取窗口句柄 对比下是否一致 有可能是子进程也拥有了句柄 比如小组件(顶部栏,关闭按钮这些) 虽然chrome只有一个句柄但是关闭按钮这些都是而外的句柄 操作窗口需要使用的是主句柄 带有Mian的 工具:https://cos.kiic.top/assets/LookHandles.exe

kihlh commented 1 year ago

如果句柄一致 无法修改那就是没有权限或者被拦截 当前BUG无法复现,后期我会增加一个debug的选项打开时 当遇上修改失败不返回布尔 而是报错 image

wuchuguang commented 1 year ago

我是用admin启动的node,权限是够的。我用你发的工具试一下。

wuchuguang commented 1 year ago

进程是对的, getHandleProcessID的handler和你发的工具看到的handle不匹配。

wuchuguang commented 1 year ago

能不能根据一个pid拿到所有window handle,然后自已做判断,再操作想要的handle

kihlh commented 1 year ago

puppeteer应该是个傀儡,有子进程进行控制一个进程控制,进程/子进程之间不互通,我的建议是直接枚举系统所有窗口获取窗口 getAllWindowsHandle函数 因为这个是所有句柄并不管是不是窗口 所以需要先判断句柄过滤掉没用的 ` //只获取窗口句柄 而不是组件句柄,等信息一起返回 hmc.getAllWindowsHandle().filter(hwnd=>hwnd.isHandle)

`

kihlh commented 1 year ago
const winHandleList =hmc.getAllWindowsHandle().filter(hwnd=>hwnd.isHandle);
for (let index = 0; index < winHandleList.length; index++) {
    const handle = winHandleList[index];
    if(handle?.title?.includes('chrome的句柄操作不了')){
        handle.setTitle("问题解决")
    }
}
kihlh commented 1 year ago

getAllWindowsHandle 返回的是伪句柄类 已经预先封装了很多个方法绑定, image

kihlh commented 1 year ago

您的想法很棒 这个api我会尽快补上

wuchuguang commented 1 year ago

好的,我获取到了对应的handle了,但用hwin.setTitle的方式,false.用HMC.setWindowTitle是可以的。