• VC 各种情况下的窗口句柄的获取


    动窗口的句柄。否则,返回值为NULL。

    GetSafeHwnd

    函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。
    通过下面的例子来看其理由:
      CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器

      HWND hwnd = pwnd->m_hwnd; //得到它的HWND

      这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:

      CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器

      HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND

      就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL


    IsWindowVisible
    函数功能:该函数获得给定窗口的可视状态。

    函数原型:BOOL IsWindowVisible(HWND hWnd);

    参数;

      hWnd:被测试窗口的句柄。

    返回值:
        如果指定的窗口及其父窗口具有WS_VISIBLE风格,返回值为非零;如果指定的窗口及其父窗口不具有WS_VISIBLE风格,返回值为零。由于返回值表明了窗口是否具有Ws_VISIBLE风格,因此,即使该窗口被其他窗口遮盖,函数返回值也为非零。
    备注:
        窗口的可视状态由WS_VISIBLE位指示。当设置了WS_VISIBLE位,窗口就可显示,而且只要窗口具有WS_VISIBLE风格,任何画在窗口的信息都将被显示。


    IsWindow
    函数功能:该函数确定给定的窗口句柄是否标示一个已存在的窗口。 
    函数原型:BOOL IsWindow(HWND hWnd);
    参数:
        hWnd:被测试窗口的句柄。
    返回值:
        如果窗口句柄标识了一个已存在的窗口,返回值为TURE;如果窗口句柄未标识一个已存在窗口,返回值为FALSE。

    FindWindow
    HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName );
    参数:
    lpClassName

      指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已 经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节 中,lpClassName的高位字节置零。

    lpWindowName

      指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
    返回值:
    如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。

      如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
    SetWindowText:
    至于窗口标题的改变,我们可以通过SetWindowText来实现
    注:如果窗口本身属性是不显示标题的,这个函数的调用不会影响窗口属性。
    //Set title for application’s main frame window .
    AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") )

    //Set title for View’s MDI child frame window .
    GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame new title") )

    //Set title for dialog’s push button control.
    GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button new title ") )

    其他:

    1、直接得句柄
            GetActiveWindow();        //得激活窗口句柄

            GetForegroundWindows();           //的前台窗口句柄

           AfxGetApp()->GetMainWnd()->GetSafeHwnd()      //很常规的,涉及到很多方法

    2、枚举型的

         HWND GetWindow(HWND hWnd, UINT uCmd );      //要先有hWnd,然后指明uCmd 的关系

         HWND FindWindowEx( HWND hwndParent,

                                             HWND hwndChildAfter,  

                                             LPCTSTR lpszClass, L

                                             PCTSTR zWindow);   

         //由类名和窗口标题得句柄,可能不只一个,所以不唯一确定

    3、其他参数的句柄

         进程ID:

        MARK:由句柄得ID可以用GetWindowThreadProcessId()

        而由ID的句柄只能枚举+比较了

    历遍全部窗体,并取得他们对应的HWND进一步取得对应PID,符合已知PID的就是了,当然可能要判断一下窗体状态了,如果进程只有一个窗体那就不用了。

    例:
    如果要在列表框里显示所有的窗口

    EnumWindows()与EnumWindowsProc()的工作过程是这样的:当EnumWindows获取到一个窗口句柄后就会调用EnumWindowsPro,在该函数里做想要的处理,

    然后EnumWindows又获取到下一个窗口的句柄交给EnumWindowsPro,知道所有的窗口枚举完为止。
    BOOL CALLBACK EnumWindowsProc(
       HWND hwnd,       // handle to parent window
       LPARAM lParam    // application-defined value
    )
    {
    char lpWinTitle[256]; 
    ::GetWindowText(hwnd,lpWinTitle,256-1); 
    CString m_strTitle;
    m_strTitle.Format("%s",lpWinTitle);
    CListBox *p_l = (CListBox *)lParam;
    if (!m_strTitle.IsEmpty())
    {
       p_l->AddString(lpWinTitle);
    }
    return TRUE;
    }

    调用EnumWindows(EnumWindowsProc, (LPARAM)GetDlgItem(IDC_LIST1));

  • 相关阅读:
    Java基础学习篇---------static
    Java基础学习篇---------this、object的学习
    Java基础学习篇---------String、集合的学习
    Java基础学习篇---------多态
    Java基础学习篇---------继承
    Java基础学习篇---------封装
    Java基础学习篇---------多线程
    Handler主线程和子线程相通信
    Handler的使用
    c# DataGridView操作
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3913405.html
Copyright © 2020-2023  润新知