询问者
通过Hide方法隐藏的窗体,在另外一个进程中如何将他显示出来?

问题
-
程序A:WPF开发,运行之后用户可以点击“隐藏”按钮将窗体隐藏(通过this.Hide()方法)
程序B:WPF开发,通过FindWindow API函数找到正在运行的程序A,再用SetForegroundWindow API将程序A显示到前台
可是,如果程序A已经处于“隐藏”状态,此时SetForegroundWindow就无效,程序A的窗体仍然处于不可见状态,即使再加上ShowWindow也没有用
程序B的代码:
do { hNext = FindWindowEx(IntPtr.Zero, hNext, IntPtr.Zero, null); if (!hNext.Equals(IntPtr.Zero)) { StringBuilder s = new StringBuilder(512); int i = GetWindowText(hNext, s, s.Capacity); title = s.ToString(); if (title.IndexOf("XXXXXX") != -1) { Console.WriteLine(title); SetForegroundWindow(hNext); //ShowWindow(hNext, SW_RESTORE);//没效果 ShowWindow(hNext, SW_SHOW);//也没有效果 break; } } } while (!hNext.Equals(IntPtr.Zero));
我能否根据窗体的句柄获得窗体的对象,这样我就可以用Show()方法来显示?
da jia hao!
全部回复
-
可以使用ShowWindowAsync
[DllImport("User32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); //API 常数定义 private const int SW_HIDE = 0; private const int SW_NORMAL = 1; //正常弹出窗体 private const int SW_MAXIMIZE = 3; //最大化弹出窗体 private const int SW_SHOWNOACTIVATE = 4; private const int SW_SHOW = 5; private const int SW_MINIMIZE = 6; private const int SW_RESTORE = 9; private const int SW_SHOWDEFAULT = 10;
也可以搭配IsWindowVisible检测窗口是否隐藏
- 已编辑 ARM830 2020年10月28日 11:57
-
ShowWindowAsync只是异步版本,和ShowWindow没有本质区别啊。
我的意思是,程序A的窗体,通过Hide()方法隐藏掉了,此时任务栏上也没有它的图标;
接着程序B,通过FindWindow找到A的窗体句柄,再用ShowWindow API函数无法将A的窗体显示出来(A的窗体会闪一下,然后立即消失,任务栏上已经显示了它的图标)
(注意:如果A的窗体没有隐藏,代码就完全没有问题,现在要解决当A的窗体隐藏了之后的情况
另外你演示的图里面,只是将窗体最小化了,而不是隐藏【this.Hide()】
)
da jia hao!
- 已编辑 liubin 2020年10月29日 9:54