我创建了WinForm应用程序,该应用程序的webBrowser控件与Fill属性停靠在一起,并将用户重定向到用户提供的URL。我正在从chrome Extension执行winForm进程并获取chrome的句柄并更改子进程的父级( WinForm)到Chrome浏览器进程。
当我最小化镶边并再次还原时,我失去了焦点。
但是在切换选项卡或从Alt + Tab定位到我的winForm .exe时,焦点又回来了。
每当用户进入我的活动标签时,如何设置.exe的焦点。
我已经用C#编写了应用程序,并使用了非托管代码SetParent(子句柄,父句柄)API来附加我的.exe。
一些我已经尝试过的链接:
https://www.codeproject.com/Articles/101367/Code-to-Host-a-Third-Party-Application-in-our-Proc
Docking Window inside another Window
Hosting external app in WPF window
代码段:
在无限的while循环中在线程中侦听以下C#代码段,以从我的main.js中获取消息
private void SetAsParent()
{
try
{
Process[] p = Process.GetProcessesByName("chrome");
foreach (Process item in p)
{
if (!String.IsNullOrEmpty(item.MainWindowTitle))
{
if (item.MainWindowTitle.Contains("Some Title to match my condition to show the exe...."))
{
this.Top = 78;
this.Left = 0;
SetParent(this.Handle, item.MainWindowHandle);
this.Visible = true;
this.Show();
this.Focus();
webBrowser.Navigate(some URL);
webBrowser.Size = new Size(1366, 979);//dynamic values coming from chrome main.js message via postMessage()
}
}
else
{
this.Hide();
}
}
this.Size = new Size(1366, 979);
}
catch (Exception ex)
{
Debug.WriteLine("Inside Form Load : {0}", ex.Message.ToString());
}
}
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
Chrome Extenion main.js:
chrome.windows.onFocusChanged.addListener(function(){
chrome.windows.getCurrent(function(window){ console.log(window.state); if(window.state == "normal") { Some message to port... } else if(window.state == "maximized") { Focus message to port... } else if(window.state == "minimized") { Minimised message to port.... } });
});
预期输出:
在切换选项卡时,焦点会保留,但是在最小化和恢复时,焦点会丢失。