我可以获取电子窗口的MainWindowHandle吗?

时间:2018-07-20 15:58:34

标签: c# window electron

我有一个产生C#应用程序的Electron应用程序。 C#应用程序希望获取Electron BrowserWindow的MainWindowHandle,但是它总是返回IntPtr.Zero,我不知道为什么。

docs说:

  

您必须使用Refresh方法刷新Process对象以获取当前主窗口句柄(如果已更改)。

     

如果关联的进程没有主窗口,则MainWindowHandle的值为零。对于已隐藏的进程,即在任务栏中不可见的进程,该值也为零。

我的C#应用​​运行Refresh,以防万一,并且我的Electron窗口绝对可见,并且在任务栏中看到该图标:

enter image description here

我的Electron代码启动我的C#应用​​程序并将其发送给渲染器进程的pid(您可以下载electron-quick-start应用程序并进行以下更改以重现):

const mainWindow = new BrowserWindow({width: 800, height: 600, show: false});
mainWindow.once("ready-to-show", () => {
    mainWindow.show();
});

mainWindow.once("show", () => {
    // by now, our window should have launched, and we should have a pid for it
    const windowPid = mainWindow.webContents.getOSProcessId();

    const proc = cp.spawn("my/exeFile.exe");

    // send the pid to the C# process
    const buff = Buffer.allocUnsafe(4);
    buff.writeIntLE(windowPid, 0, 4);
    proc.stdin.write(buff);
});

然后C#进程启动并通过无限循环加入线程,该循环读取该pid并尝试获取其主窗口句柄:

byte[] buffer = new byte[4];
inStream.Read(buffer, 0, 4);
int pid = BitConverter.ToInt32(buffer, 0); // I've verified that the pid I'm sending is the pid I'm getting

Process proc = Process.GetProcessById(pid);
proc.Refresh(); // just in case

IntPtr windowHandler = proc.MainWindowHandle; // 0x00000000
IntPtr handle = proc.Handle; // 0x000004b8
  1. 我要发送正确的电子pid吗?我看不到其他可以使用的pid。主要进程pid似乎不正确,所以我只剩下渲染器pid,这就是我正在使用的。

  2. 当该窗口是电子/铬窗口时,我应该期望设置MainWindowHandle还是仅适用于C#窗口?

1 个答案:

答案 0 :(得分:3)

有一个BrowserWindow API:

win.getNativeWindowHandle()

返回可以在任何本机Windows代码中使用的HWND

就您而言,我想您可以这样使用它:

byte[] bytes = new byte[8];
for (int i = 0; i < data.Length; i++) {
  object item = data[i];
  bytes[i] = (byte)(int)item;
}
return BitConverter.ToUInt64(bytes, 0);