如何使用 ShowWindow 显示已经隐藏的windows?
How to use ShowWindow to show already hidden windows?
我正在编写一个 C# 程序,我在其中使用 ShowWindow 来显示或隐藏 其他进程 的 windows。我的问题是,如果 window 在程序 运行.
之前已经隐藏,我将无法使用我的程序显示或隐藏 windows 个进程
例如,如果我运行我的程序,隐藏一些其他进程的window,然后显示它,它会正常工作。但是,如果我要运行我的程序,隐藏一些其他进程的window,终止我的程序,然后再次运行我的程序,我将无法显示window 那个过程了。
我希望能够显示 windows 个隐藏进程,即使它们在程序 运行 之前被隐藏。我怎样才能做到这一点?
Program.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 2)
{
if (args[0] == "showh")
{
int handle;
int.TryParse(args[1], out handle);
App.ShowHandle(handle);
}
else
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
App app = new App(process);
if (args[1] == app.Name)
{
if (args[0] == "show")
{
app.Show();
}
else
{
app.Hide();
}
}
}
}
}
}
}
}
App.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class App
{
[DllImport("User32")]
private static extern int ShowWindow(int hwnd, int nCmdShow);
private const int SW_HIDE = 0;
private const int SW_SHOW = 5;
public String Name { get; private set; }
private Process process { get; set; }
public App(Process process)
{
this.Name = process.ProcessName;
this.process = process;
}
public void Hide()
{
int windowHandle = this.process.MainWindowHandle.ToInt32();
Console.WriteLine("Hiding {0}: has window handle {1}", this.Name, windowHandle);
ShowWindow(windowHandle, SW_HIDE);
}
public void Show()
{
int windowHandle = this.process.MainWindowHandle.ToInt32();
Console.WriteLine("Showing {0}: has window handle {1}", this.Name, windowHandle);
ShowWindow(windowHandle, SW_SHOW);
}
public static void ShowHandle(int handle)
{
Console.WriteLine("Showing window handle {0}", handle);
ShowWindow(handle, SW_SHOW);
}
}
}
更新 1:添加了最小和完整的代码示例。
更新 2:经过进一步的实验,大多数进程确实给我一个 window 零句柄。但是,在极少数情况下,我得到一个非零 window 句柄,但 window 句柄不正确。
错误如下:隐藏进程时的句柄值与我尝试显示进程时的句柄值不同。
但是,如果我记得隐藏时进程的 window 句柄,我可以再次显示 window 无论如何。我更新了我的代码示例以反映这一点。
然后我的问题变成了:如果进程一开始是隐藏的,为什么我无法获得正确的 window 进程句柄? (但如果进程可见,然后隐藏,我可以获得 window 句柄。)
由于没有收到任何答复,我想出了以下解决方案:
记住进程的window句柄并将其与进程ID相关联。将其保存到文件中。当我的应用程序重新启动时,从文件中读取。我现在可以使用这些保存的 window 句柄来显示关联进程 ID 的隐藏 windows。
而且我还可以使用这个 id 来取回进程对象。
Process proc = Process.GetProcessById(processID);
此外,一旦 windows 显示出来,我就可以再次使用
获得 window 句柄
int windowHandle = this.process.MainWindowHandle.ToInt32();
如果谁有更好的解决方案欢迎评论。但是,这是我现在要使用的解决方案。
我正在编写一个 C# 程序,我在其中使用 ShowWindow 来显示或隐藏 其他进程 的 windows。我的问题是,如果 window 在程序 运行.
之前已经隐藏,我将无法使用我的程序显示或隐藏 windows 个进程例如,如果我运行我的程序,隐藏一些其他进程的window,然后显示它,它会正常工作。但是,如果我要运行我的程序,隐藏一些其他进程的window,终止我的程序,然后再次运行我的程序,我将无法显示window 那个过程了。
我希望能够显示 windows 个隐藏进程,即使它们在程序 运行 之前被隐藏。我怎样才能做到这一点?
Program.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 2)
{
if (args[0] == "showh")
{
int handle;
int.TryParse(args[1], out handle);
App.ShowHandle(handle);
}
else
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
App app = new App(process);
if (args[1] == app.Name)
{
if (args[0] == "show")
{
app.Show();
}
else
{
app.Hide();
}
}
}
}
}
}
}
}
App.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public class App
{
[DllImport("User32")]
private static extern int ShowWindow(int hwnd, int nCmdShow);
private const int SW_HIDE = 0;
private const int SW_SHOW = 5;
public String Name { get; private set; }
private Process process { get; set; }
public App(Process process)
{
this.Name = process.ProcessName;
this.process = process;
}
public void Hide()
{
int windowHandle = this.process.MainWindowHandle.ToInt32();
Console.WriteLine("Hiding {0}: has window handle {1}", this.Name, windowHandle);
ShowWindow(windowHandle, SW_HIDE);
}
public void Show()
{
int windowHandle = this.process.MainWindowHandle.ToInt32();
Console.WriteLine("Showing {0}: has window handle {1}", this.Name, windowHandle);
ShowWindow(windowHandle, SW_SHOW);
}
public static void ShowHandle(int handle)
{
Console.WriteLine("Showing window handle {0}", handle);
ShowWindow(handle, SW_SHOW);
}
}
}
更新 1:添加了最小和完整的代码示例。
更新 2:经过进一步的实验,大多数进程确实给我一个 window 零句柄。但是,在极少数情况下,我得到一个非零 window 句柄,但 window 句柄不正确。
错误如下:隐藏进程时的句柄值与我尝试显示进程时的句柄值不同。
但是,如果我记得隐藏时进程的 window 句柄,我可以再次显示 window 无论如何。我更新了我的代码示例以反映这一点。
然后我的问题变成了:如果进程一开始是隐藏的,为什么我无法获得正确的 window 进程句柄? (但如果进程可见,然后隐藏,我可以获得 window 句柄。)
由于没有收到任何答复,我想出了以下解决方案:
记住进程的window句柄并将其与进程ID相关联。将其保存到文件中。当我的应用程序重新启动时,从文件中读取。我现在可以使用这些保存的 window 句柄来显示关联进程 ID 的隐藏 windows。
而且我还可以使用这个 id 来取回进程对象。
Process proc = Process.GetProcessById(processID);
此外,一旦 windows 显示出来,我就可以再次使用
获得 window 句柄int windowHandle = this.process.MainWindowHandle.ToInt32();
如果谁有更好的解决方案欢迎评论。但是,这是我现在要使用的解决方案。