【发布时间】: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