一种特殊情况的问题:

  • 我用System.Diagnostics.Process.Start(..)启动一个进程
  • 该过程打开一个闪屏 - 这个闪屏成为主窗口。
  • 启动画面关闭,显示“真实”UI。 主窗口(启动画面)现在无效。
  • 我仍然有Process对象,我可以查询它的句柄,模块等。但是主窗口句柄现在无效。

此时我需要获取进程的UI(或UI句柄)。 假设我无法改变流程的行为以使其更容易(或更安全)。

我在网上看了一下,但我承认我没有看一个多小时。 看起来像它应该有点琐碎:-(

===============>>#1 票数:10 已采纳

如果您不介意使用Windows API,可以使用EnumWindowsProc ,并使用GetWindowThreadProcessId检查每个句柄(以查看它在您的过程中),然后可能是IsWindowVisibleGetWindowCaptionGetWindowTextLength来确定哪个hWnd在你的过程中是你想要的。

虽然如果你在这种方法之前没有使用过那些功能会是一种正确的痛苦,所以希望有一种更简单的方法。

===============>>#2 票数:7

@ageektrapped位于正确的轨道上,但FindWindow不会搜索子窗口。

为此,您需要使用FindWindowEx

===============>>#3 票数:3

谢谢您的回答。 在这里感谢你,我想出了如何知道进程的主窗口是否在前面:

注意:当然这需要System.Diagnostic和System.Runtime.Interrop

public bool IsWindowActive(Int32 PID)
{
  return IsWindowActive(Process.GetProcessById(PID));
}

[DllImport("user32.dll")]
private static extern
IntPtr GetForegroundWindow();

public bool IsWindowActive(Process proc)
{
  proc.Refresh();
  return proc.MainWindowHandle.Equals(GetForegroundWindow());
}

===============>>#4 票数:2

您可能会发现,如果您调用.Refresh(),您将获得新的顶级窗口。

===============>>#5 票数:1

使用Process.GetProcessById(proc.Id); proc是你的闪屏。 适合我。

现在,如何使用win32获取System.Windows.Forms中的主窗口属性以使其无焦点? 毕竟.net应该是一站式解决方案 - 不是吗?

===============>>#6 票数:1

如果您知道窗口的标题,则可以通过P / Invoke使用Win32调用FindWindow。

你可以找到签名这里上pinvoke.net

===============>>#7 票数:1

根据我的理解,您启动的进程的MainWindowHandle属性无效。 如果是这种情况,您可以使用FindWindow函数(来自Win32 SDK)返回您需要的窗口句柄。 您只需要目标应用程序主窗口的类名。 您可以使用Spy ++或Winspector获取它。 您还需要通过使用GetWindowThreadProcessId检查该窗口的进程ID来确保您拥有正确的窗口。

最后,我不得不说我不是Win32的专家,可能会有更好的解决方案。

===============>>#8 票数:0

在代码的某处,创建了“真实”主窗口。 您可以在那时保存窗口句柄,然后在启动屏幕关闭后,您可以将Application.MainWindow设置为真实窗口。

===============>>#9 票数:0

MainWindowHandle属性在首次访问后被缓存,这就是即使在句柄变为无效之后您也看不到它的变化。 GregUzelac的信息是正确的。 调用Proces.Refresh将导致对Process.MainWindowHandle的下一次调用重新执行逻辑以查找新的主窗口句柄。 迈克尔的逻辑也有效,因为新进程没有MainWindowHandle的缓存版本。

  ask by shea241 translate from so

未解决问题?本站智能推荐:

2回复

如何抑制可调整大小的WPF窗口最大化的能力

我有一个WPF应用程序,该应用程序的Window的WindowStyle为none,并且可调整大小。 我不希望用户能够最小化或最大化Window,所以我只是不公开那些操作的按钮。 这很好用,但是我刚刚意识到在Win7 +上,只需将其拖动到屏幕顶部附近即可最大化Windows。 有什么方
2回复

.net和工具栏,菜单和状态栏渲染模式(蓝色)和标准格式(灰色)的问题

Hiya,我是.NET的新手,所以请忽略我的无知。 如果查看上面的图像(完整的原型,请忽略黑色的位点:),您将看到可爱的菜单,工具栏和状态栏,它们均使用Windows XP渲染模式并呈时髦的蓝色。 查看表格,标签,复选框和其他按钮,您会看到可怕的老式灰色学校窗户。 这些组件没有渲染模式
1回复

用窗口更改大小的WPF Gui?

是否有人对如何创建可以随窗口大小更改大小的gui提出建议。 与Media Center的工作原理类似。 如果媒体中心最大化,则字体等的大小会增加。 那么,gui总是“统一”的吗?
1回复

用户登录Windows时,ToolStripButton从PropertyGrid中消失

我有一个问题,情况如下: 我已经使用一个组件PropertyGrid创建了用户控件。 在此PropertyGrid我向PropertyGrid的ToolStrip添加了按钮(十六进制模式)。 一切都很好,效果很好! 但是,当该控件以表格形式显示并且用户按"Windows->
4回复

活动标题文本颜色-检测更改(在.Net中)

在Vista上启用了Aero的情况下,正常模式下的窗口标题为黑色(写在浅色玻璃上),而最大化时标题为白色(写在深色玻璃上)。 如何确定窗口标题的当前颜色? PS我编写了一个程序来监视SystemColors.ActiveCaptionTextColor ,但是在两种模式下它保持不变。
5回复

F#是.net windows开发的可用语言吗?

我一直听说过F#,微软现在有一个人在redmond的某处写博客和编码。 你真的可以从F#编写GUI代码(我很乐意看到一个例子,例如在表单中添加一个按钮并订阅onclick事件) F#是否可以完全访问所有.Net? 我老实说好奇,我知道我可以谷歌,但我很乐意听到真正使用该语言的人。
7回复

在确定菜单项目的位置时是否有任何标准可供遵循?

在开发基于Windows窗体的应用程序时,在设计表单的主菜单系统时是否应遵循任何标准? 大多数带菜单系统的Windows应用程序都有您的标准文件| 编辑| 查看| 工具| 帮助菜单。 如何确定任何其他顶级菜单项的位置? 另外,如何确定子菜单项的位置? 例如,您将遵循哪些规
1回复

在C#中的窗口中绘制绝对线

我在Windows上具有多行文本字段的应用程序。 我需要一种在该文本字段上绘制线条的方法,这样您就可以看到键入的字母和那些线条。 我需要使用C#来做到这一点,但是我可以使用用C ++编写的.dll。 我听说过有关子类化的信息,可以从窗口中继承渲染功能并对其进行调整,如何使用C#做到这一
4回复

Java与C#和.NET之间的差异[关闭]

为可能的火焰线预先道歉,但这不是我想要的。 我只使用C和C ++在Linux上进行了认真的开发,我正在寻求进入Windows。 我一直在做一些阅读和询问,在我看来,带有C#的.NET是开发面向Windows的商业用户导向业务应用程序的方法。 对我来说最重要的考虑是将用户界面集成到桌
6回复

.NET GUI - C#vs C ++ / CLI

我正在写一个小应用程序,需要一些列表框,按钮,文本框。 它将与Boost,MySQL等C ++静态库链接。 该项目需要win32功能。 我认为Winforms会很好(MFC和CodeJock需要太多时间)。 所以C ++ / CLI似乎非常适合这项工作。 只需在GUI旁边使用标准C