获取窗口句柄

在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,
系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对
142号窗口进行操作——移动窗口、改变窗口大小、把窗口最小化等等。实际上许多Windows API函数把句
柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗
口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存
块、光标、字体、菜单等。

定义
句柄是什么?
在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄,
句柄也可以映射到唯一的对象。

用途
为什么我们需要句柄?
更准确地说,是windows需要句柄。windows需要向程序员提供必要的编程接口,在这些接口中,允许程序员访问、创建和销毁对象。但是,出于封装地考虑,windows并不想向程序员返回指针。指针包含了太多的信息。首先指针给出了对象存储的确切位置;其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作系统想向程序员隐藏的。如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向
你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需。

下面是我写的一个例子,实现功能效果是当主窗口最小化时,当前所有打开窗口隐藏,主窗口显示时,所有打开窗口显示。

	/// <summary>
    /// 获取窗体的句柄函数
    /// </summary>
    /// <param name="lpClassName">窗口类名</param>
    /// <param name="lpWindowName">窗口标题名</param>
    /// <returns>返回句柄</returns>
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    /// <summary>
    /// 通过句柄,窗体显示函数
    /// </summary>
    /// <param name="hWnd">窗体句柄</param>
    /// <param name="cmdShow">显示方式</param>
    /// <returns>返工成功与否</returns>
    [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
    public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

	private void Form1_Resize(object sender, EventArgs e)
    {
        
        #region 窗体句柄操作
        string[] name = { "YangPinMoBan", "MoBanKu", "LoadingForm" };//窗口标题名

        if (WindowState == FormWindowState.Minimized) //判断是否为最小化
        {

            for (int i = 0; i < name.Length; i++)
            {
                IntPtr mainHandle = FindWindow(null, name[i]);
                if (mainHandle != IntPtr.Zero)//判断这个窗体是否有效
                {
                    //通过句柄设置当前窗体最大化(0:隐藏窗体,1:默认窗体,2:最小化窗体,			3:最大化窗体,....)
                    bool result = ShowWindowAsync(mainHandle, 0);    
                }
            }
        }

        if (WindowState == FormWindowState.Normal)  //判断是否为默认大小的窗口
        {
            for (int i = 0; i < name.Length; i++)
            {
                IntPtr mainHandle = FindWindow(null, name[i]);
                if (mainHandle != IntPtr.Zero)//判断这个窗体是否有效
                {
                    //通过句柄设置当前窗体最大化(0:隐藏窗体,1:默认窗体,2:最小化窗体,3:最大化窗体,....)
                    bool result = ShowWindowAsync(mainHandle, 1);
                }
                
            }
        }
       
        #endregion

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值