现在想做一个程序A,隐藏程序B的主窗口,以及程序B开的非模态的其他窗口,隐藏之后还可以还原。要怎么做呢?如果发现了程序B的非模态窗口,可以通过User32的FindWindow(string lpClassName, string lpWindowName)找到这个窗口,并使用SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam)方法隐藏。现在问题是,我不知道程序B可能开出的非模态窗口有什么。
调试欢乐多
public delegate bool CallBack(IntPtr hwnd, IntPtr lParam);
//遍历所有顶级窗体
[DllImport("User32.dll")]
public static extern bool EnumWindows(CallBack pfn, IntPtr lParam);
//获得窗体Title
[DllImport("User32.dll")]
public static extern int GetWindowText(IntPtr hwnd, StringBuilder text, int len);
//保存当前的className,遍历窗体时比较用
private static string _className = "";//遍历顶级窗体的回调方法
static bool EnumChilds(IntPtr hwnd, IntPtr lParam)
{
var sbClassName = new StringBuilder(200);
GetClassName(hwnd, sbClassName, sbClassName.Capacity);
if (_className == sbClassName.ToString())
{
var title = new StringBuilder(200);
GetWindowText(hwnd, title, title.Capacity);
Console.WriteLine(title);
}
return true;
}
--------------
//获得其他进程
var ps = Process.GetProcessesByName("TestForms");
//获得进程的主窗体句柄
IntPtr main = ps[0].MainWindowHandle;
//获得主进程className
var sbClassName = new StringBuilder(200);
GetClassName(main, sbClassName, sbClassName.Capacity);
_className = sbClassName.ToString();
//开始遍历
var test = EnumWindows(EnumChilds, IntPtr.Zero);