【问题标题】:How can I get Process.MainWindowHandle that was minimized via SetWindowVisualState without storing the IntPtr?如何在不存储 IntPtr 的情况下获得通过 SetWindowVisualState 最小化的 Process.MainWindowHandle?
【发布时间】:2021-06-22 14:39:14
【问题描述】:

我正在尝试制作一个程序来检测其他窗口,将窗口最小化一小段时间,然后在另一个程序中使同一窗口正常。

最小化很容易(为了让代码简洁,我没有错误处理):

var p = Process.GetProcessesByName("MyTargetWindow").GetFirstOrDefault();
var elem = AutomationElement.FromHandle(p.MainWindowHandle);
var pattern = elem.GetCurrentPattern(WindowPattern.Pattern) as WindowPattern;
pattern.SetWindowVisualState(WindowVisualState.Minimized);

现在我想从另一个程序再次使窗口正常大小。

此时,如果我存储p.MainWindowHandle 并重新使用它,我没有任何问题。

但是,如果我不这样做,并且如果我尝试按照类似的代码运行以使窗口正常,则在调用 GetCurrentPattern 时我将收到 InvalidOperationException。 (据我了解,新手柄不支持Pattern)

var p = Process.GetProcessesByName("MyTargetWindow").GetFirstOrDefault();
var elem = AutomationElement.FromHandle(p.MainWindowHandle);
var pattern = elem.GetCurrentPattern(WindowPattern.Pattern) as WindowPattern; // InvalidOperationException
pattern.SetWindowVisualState(WindowVisualState.Normal);

原因很简单,第二个代码中的p.MainWindowHandle,和原来的窗口不一样。

问题是为什么p.MainWindowHandle 不同?

最终,我怎样才能重新检索相同的句柄而不将句柄存储在变量中

编辑:

如果 IntPtr 存储是强制性的,我别无选择,只能将其作为字符串存储在磁盘上,然后通过 new IntPtr(Convert.ToInt32) 重新检索它,我希望有其他解决方案。

EDIT2:

存储 IntPtr 对我来说仍然存在问题。最终,我可以将它存储到注册表并读取它,但我还必须跟踪句柄何时存储到注册表。它变得比我想象的要复杂。

我真的很希望有办法不存储 IntPtr 并仍然找到正确的句柄。

【问题讨论】:

    标签: c# windows window-handles


    【解决方案1】:

    “主窗口是当前具有焦点的进程打开的窗口(TopLevel 窗体)。”但是最小化的窗口不能再获得焦点了。

    在上面保存IntPtr 和 P/Invoke ShowWindow()。一个更简单的命题;当你可以用你已经拥有的东西来做的时候,把自动化等等搞乱是没有意义的。

    我不建议在本机代码中重新实现整个“查找窗口句柄”之类的东西的原因是它不稳定,因为其他进程可以在两次之间创建/销毁窗口,所以你不会无论您做什么,都能可靠地再次抓取同一个窗口。

    【讨论】:

    • 感谢您的快速回复。如果 IntPtr 存储是强制性的,我别无选择,只能将其作为字符串存储在磁盘上,然后通过 new IntPtr(Convert.ToInt32) 重新检索它:( 我希望我可以避免这种情况
    • @ShinT:如果您将窗口句柄存储到磁盘,则需要以更大的块进行重构,直到您不需要这样做为止。
    • 您介意澄清一下“在更大的块中重构”是什么意思吗?
    • @ShinT:向上推动更改,直到找到在此期间驻留在内存中的内容。
    • @ShinT:是的,安装程序变量是一个更好的选择;但也许你可以想出一些疯狂的东西。请注意,您确实应该使用 64 位类型进行 IntPtr -> 字符串转换,以防有人将项目声明从强制 32 位更改为任何 CPU。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2010-09-25
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多