如何调用FindWindow API获取主窗体

 我来答
就烦条0o
2017-03-21 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace HtmlShow
{
    /**/
    /// <summary>
    /// This class is to find the given window's child window accroding to the given child window's name.
    /// The useage: FindWindow fw = new FindWindow(wndHandle, "ChildwndClassName"); IntPtr ip = fw.FoundHandle;
    /// I adapt the code from Paul DiLascia,who is the MSDN Magazine's writer.
    /// The original class is named CFindWnd which is written in C++, and you could get it on Internet.
    /// www.pinvoke.net is a great website.It includes almost all the API fuctoin to be used in C#.
    /// </summary>
    class FindWindow
    {
        [DllImport("user32")]
        [return: MarshalAs(UnmanagedType.Bool)]
        //IMPORTANT : LPARAM  must be a pointer (InterPtr) in VS2005, otherwise an exception will be thrown
        private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);
        //the callback function for the EnumChildWindows
        private delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

        //if found  return the handle , otherwise return IntPtr.Zero
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        private string m_classname; // class name to look for

        private IntPtr m_hWnd; // HWND if found
        public IntPtr FoundHandle
        {
            get { return m_hWnd; }
        }
        // ctor does the work--just instantiate and go
        public FindWindow(IntPtr hwndParent, string classname)
        {
            m_hWnd = IntPtr.Zero;
            m_classname = classname;
            FindChildClassHwnd(hwndParent, IntPtr.Zero);
        }

        //EnumChildWindows是API函数,能够遍历主窗口下所有子窗口。不过它的遍历过程是通过
        //第二个参数即回调函数与程序员交互的。EnumChildWindows每找到一个窗口。就调用回调
        //函数。回调函数如果返回false。遍历就会结束。

        /**/
        /// <summary>
        /// Find the child window, if found m_classname will be assigned 
        /// </summary>
        /// <param name="hwndParent">parent's handle</param>
        /// <param name="lParam">the application value, nonuse</param>
        /// <returns>found or not found</returns>
        //The C++ code is that  lParam is the instance of FindWindow class , if found assign the instance's m_hWnd
        private bool FindChildClassHwnd(IntPtr hwndParent, IntPtr lParam)
        {
            EnumWindowProc childProc = new EnumWindowProc(FindChildClassHwnd);
            IntPtr hwnd = FindWindowEx(hwndParent, IntPtr.Zero, this.m_classname, string.Empty);
            if (hwnd != IntPtr.Zero)
            {
                this.m_hWnd = hwnd; // found: save it
                return false; // stop enumerating
            }
            EnumChildWindows(hwndParent, childProc, IntPtr.Zero); // recurse  redo FindChildClassHwnd
            return true;// keep looking
        }
    }
}

 //this.Handle是要查找窗口的父窗口,因为我使用的是webBrowser控件
 FindWindow fw = new FindWindow(this.Handle, "Internet Explorer_Server");
 hIE = fw.FoundHandle;

1、通过程序名获取该进程Process.GetProcess();
2、获取主界面窗口句柄Process.MainWindowHandle

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式