我有一个产生C#应用程序的Electron应用程序。 C#应用程序希望获取Electron BrowserWindow的MainWindowHandle
,但是它总是返回IntPtr.Zero
,我不知道为什么。
docs说:
您必须使用
Refresh
方法刷新Process
对象以获取当前主窗口句柄(如果已更改)。如果关联的进程没有主窗口,则
MainWindowHandle
的值为零。对于已隐藏的进程,即在任务栏中不可见的进程,该值也为零。
我的C#应用运行Refresh
,以防万一,并且我的Electron窗口绝对可见,并且在任务栏中看到该图标:
我的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
我要发送正确的电子pid吗?我看不到其他可以使用的pid。主要进程pid似乎不正确,所以我只剩下渲染器pid,这就是我正在使用的。
当该窗口是电子/铬窗口时,我应该期望设置MainWindowHandle
还是仅适用于C#窗口?
答案 0 :(得分:3)
有一个BrowserWindow
API:
返回可以在任何本机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);