我有一个新的System.Diagnostics.Process,它启动了FireFox。如何获得该窗口的处理程序?任何想法 - C#,winAPI函数......任何事情(只是不是ASM;))
答案 0 :(得分:3)
启动该过程后,您可以调用process.Refresh()
,process.MainWindowHandle
属性最终将包含应用程序主窗口的本机窗口句柄。
在开始填充它之后,您可能需要等待一段时间。
以下是一些代码:
Process process = new Process();
// Fill process.StartInfo
process.Start();
do
{
System.Threading.Sleep(100);
process.Refresh();
}
while(process.MainWindowHandle == IntPtr.Zero && !process.HasExited);
if(!process.HasExited)
{
IntPtr hwnd = process.MainWindowHandle;
// Do whatever you need to do with hwnd
}
答案 1 :(得分:0)
例如......我这样做:
IntPtr hwnd = IntPtr.Zero;
System.Diagnostics.Process browserProc = new System.Diagnostics.Process();
browserProc.StartInfo.FileName = getDefaultBrowser();
browserProc.StartInfo.Arguments = webBrowser1.Url.ToString();
browserProc.StartInfo.UseShellExecute = true;
browserProc.Start();
do{
Thread.Sleep(100);
browserProc.Refresh();
} while (browserProc.MainWindowHandle == IntPtr.Zero && !browserProc.HasExited);
if (!browserProc.HasExited)
{
hwnd = browserProc.MainWindowHandle;
browserProc.WaitForInputIdle();
MoveWindow(browserProc.MainWindowHandle, p.X, p.Y, this.Width, this.Height, true);
UpdateWindow(browserProc.MainWindowHandle);
}
什么?我收到一条错误信息,如果FF已经打开(但是,我必须说,当它不是,一切都很好)。
答案 2 :(得分:0)
好的,我找到了命令,但这不是解决方案...... 我找到了启动窗口新实例的命令,它们工作正常,直到它们都没有启动。如果我启动了任何浏览器alreadi实例,那么应用程序崩溃并显示消息“进程已完成,因此请求的信息不可用”。 启动窗口的新实例(仅限firefox),但是aplication不会接收句柄并崩溃......
那么,有什么想法吗?这是代码:
private void button2_Click(object sender, EventArgs e)
{
Point p = this.Location;
this.HideBrowser();
IntPtr hwnd = IntPtr.Zero;
string arguments = string.Empty;
string browser = getDefaultBrowser(); // phisical path to default browser
if (browser.Contains("firefox"))
arguments = "-new-window " + webBrowser1.Url.ToString();
if (browser.Contains("opera"))
arguments = "-newwindow " + webBrowser1.Url.ToString();
if (browser.Contains("iexplore"))
arguments = "-nomerge " + webBrowser1.Url.ToString();
if (browser.Contains("chrome"))
arguments = "-app-launch-as-panel " + webBrowser1.Url.ToString();
System.Diagnostics.Process browserProc = new System.Diagnostics.Process();
browserProc.StartInfo.FileName = browser;
browserProc.StartInfo.Arguments = arguments;
browserProc.StartInfo.UseShellExecute = true;
browserProc.Start(); // запускаем процесс
do{
Thread.Sleep(100);
browserProc.Refresh();
} while (browserProc.MainWindowHandle == IntPtr.Zero && !browserProc.HasExited);
if (!browserProc.HasExited)//если что-то поймали
{
hwnd = browserProc.MainWindowHandle;
browserProc.WaitForInputIdle();
MoveWindow(browserProc.MainWindowHandle, p.X, p.Y, this.Width, this.Height, true);//устанавливаем новые координаты окна
UpdateWindow(browserProc.MainWindowHandle);
}
}