现在想做一个程序A,隐藏程序B的主窗口,以及程序B开的非模态的其他窗口,隐藏之后还可以还原。要怎么做呢?如果发现了程序B的非模态窗口,可以通过User32的FindWindow(string lpClassName, string lpWindowName)找到这个窗口,并使用SendMessage(IntPtr hWnd, int nMsg, IntPtr wParam, IntPtr lParam)方法隐藏。现在问题是,我不知道程序B可能开出的非模态窗口有什么。

解决方案 »

  1.   

    获得其他进程的所有窗体的方法://EnumWindows里用到的回调的delegate定义:
    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);