Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取通过SetWindowVisualState最小化的Process.MainWindowHandle,而不存储IntPtr?_C#_Windows_Window Handles - Fatal编程技术网

C# 如何获取通过SetWindowVisualState最小化的Process.MainWindowHandle,而不存储IntPtr?

C# 如何获取通过SetWindowVisualState最小化的Process.MainWindowHandle,而不存储IntPtr?,c#,windows,window-handles,C#,Windows,Window Handles,我试图制作一个程序,它检测到其他窗口,在一小段时间内最小化窗口,然后从另一个程序中使相同的窗口正常 最小化非常简单(为了使代码简洁,我没有错误处理): 现在,我想从另一个程序中重新设置窗口的正常大小 此时,如果我存储p.MainWindowHandle并重新使用它,我不会有任何问题 但是,如果我不这样做,并且如果我尝试运行以下类似的代码以使窗口正常,当调用GetCurrentPattern时,我将获得InvalidOperationException。(我知道新手柄不支持模式) 原因很简单,p.

我试图制作一个程序,它检测到其他窗口,在一小段时间内最小化窗口,然后从另一个程序中使相同的窗口正常

最小化非常简单(为了使代码简洁,我没有错误处理):

现在,我想从另一个程序中重新设置窗口的正常大小

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

但是,如果我不这样做,并且如果我尝试运行以下类似的代码以使窗口正常,当调用
GetCurrentPattern
时,我将获得InvalidOperationException。(我知道新手柄不支持模式)

原因很简单,
p.MainWindowHandle
来自第二个代码,与原始窗口不同

问题是为什么
p.MainWindowHandle
不同

最终,如何在不将句柄存储在变量中的情况下重新检索同一句柄

编辑:

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

编辑2:

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

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

“主窗口是进程打开的当前有焦点的窗口(顶级窗体)。”但最小化窗口不能再有焦点

保存
IntPtr
并在其上p/Invoke。一个简单得多的命题;当你可以用你已经拥有的东西去做的时候,就没有必要再去搞自动化了

我不建议在本机代码中重新实现整个“find window handle”(查找窗口句柄)的原因是它不稳定,因为另一个进程可以在不同时间创建/销毁窗口,所以无论您做什么,都不会可靠地再次抓取同一个窗口。

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

保存
IntPtr
并对其进行p/Invoke。这是一个简单得多的建议;当你可以用你已经拥有的东西来做的时候,没有必要去搞自动化等等


我不推荐像重新实现整个“查找窗口句柄”这样的东西的原因“本机代码中的一个问题是它不会稳定,因为另一个进程会在两个时间段之间创建/销毁窗口,所以无论您做什么,您都不会可靠地再次抓取同一个窗口。

感谢您的快速响应。如果IntPtr存储是必需的,我别无选择,只能将其作为字符串存储在磁盘上,然后通过新的IntPtr(Convert.ToInt32)重新检索它:(我希望可以避免that@ShinT:如果您要将窗口句柄存储到磁盘上,则需要将其重构为更大的块,直到您不需要这样做。您介意澄清一下您的意思吗“在更大的块中重构"?@ShinT:将更改向上推,直到找到在整个期间内存驻留的内容。@ShinT:啊,是的,安装程序变量是一个更好的选择;但可能您可以想出一些疯狂的方法。请注意,如果有人从强制32位t更改项目声明,您确实应该使用64位类型进行IntPtr->字符串转换o任何CPU。感谢您的快速响应。如果IntPtr存储是必需的,我别无选择,只能将其作为字符串存储在磁盘上,然后通过新的IntPtr(Convert.ToInt32)重新检索它:)我希望我能避免that@ShinT:如果要将窗口句柄存储到磁盘,则需要在不需要进行重构之前将其重构到较大的块中。请您澄清一下“在较大的块中重构”的含义好吗?@ShinT:将更改向上推,直到找到在整个期间内存驻留的内容。@ShinT:啊,是的,安装程序变量是一个更好的选择;但可能您可以想出一些疯狂的方法。请注意,如果有人从强制32位t更改项目声明,您确实应该使用64位类型进行IntPtr->字符串转换o任何CPU。
var p = Process.GetProcessesByName("MyTargetWindow").GetFirstOrDefault();
var elem = AutomationElement.FromHandle(p.MainWindowHandle);
var pattern = elem.GetCurrentPattern(WindowPattern.Pattern) as WindowPattern;
pattern.SetWindowVisualState(WindowVisualState.Minimized);
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);