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));

VC 各种情况下的窗口句柄的获取,布布扣,bubuko.com

时间: 2024-11-10 00:57:33

VC 各种情况下的窗口句柄的获取的相关文章

iOS 在不添加库的情况下 通过抽象类来获取自己想要的方法

#define SYSTEM_VERSION_MORE_THAN_BFDATA(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending) + (NSString *)advertisingID { NSString *returnValue = nil; if (SYSTEM_VERSION_MORE_THAN_BFDATA(@"5.9"

把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)

1.继上一篇随笔,链接点我,解决手机端cookie的问题. 2.上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的url后面. 3.但是今天发现了新的问题,js取cookie存的sessionId为空,情况如下: (1)QQ浏览器能获取某些cookie,另一些cookie获取为空,猜测是后台Response SetCookie的时候,手机端浏览器没能良好的接受. (2)UC浏览器测试正常. (3)Safari情

android百度离线地图可以通过经纬度获取当前地理信息么(不联网的情况下)

============问题描述============ 在网上找到几个例子,都是联网的情况下,求救..... ============解决方案1============ 引用 3 楼 u013365840 的回复: Quote: 引用 1 楼 sagittarius1988 的回复: 除非你有数据库,不然你是获取不到这个反向地理解析的结果的 所以如果想通过经纬度逆向解析地址的话,必须要联网状态下的是吧 你本地有数据库可以查就可以不用联网了

如何在跨平台的情况下获取可执行文件的详细信息和属性

很多情况下我们需要获取到系统中一些可执行文件的版本号,以便做一些附加动作!其实可以使用jna获取,但是这将依赖人家,所以还是Java自己来吧!好啦,直接上代码吧 /** * @Description: * * @Title: FileInfoUtil.java * @Package com.joyce.util * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-5-12 下午03:46:32 * @versi

获取span里面的值(特殊情况下 )

如何获取A? <div class="warpper"> <span class="content"> A <span>123</span> </span> </div> <script type='text/javascript' src='./jquery-1.7.2.min.js'></script> <script type='text/javascript

自动获取IP地址的命令是什么?您知道在什么情况下,您的Linux才可以自动获取IP地址?

1. 自动获取IP地址的命令是什么?您知道在什么情况下,您的Linux才可以自动获取IP地址? 答:(1) Linux中使用 dhclient 命令可以从DHCP服务器上获得一个可用的IP地址 (2)首先,需要激活网卡eth0:其次,如果linux是虚拟机,那么还需要设置虚拟机的网络是桥接 模式或者NAT模式,桥接模式必须在网络管理员允许分配IP的情况下自动获得IP地址才能成功: NAT模式一般都能成功:最后,可以配置eth0的配置文件/etc/sysconfig/network-scripts

什么情况下使用break关键字? 什么情况下使用Continue关键字? Java如何声明一个数组?JS如何声明一个数组?如何获取数组长度? 如何遍历数组?

什么情况下使用break关键字?什么情况下使用Continue关键字? Break Break关键用于终止循环. 示例: 1 2 3 4 5 6 for (int i = 0; i < 10; i++) {   if (i == 4) {     break; //终止循环,后面的循环不再执行   }   System.out.println(i); } Continue Continue关键字用于终止本次循环,其它循环继续. 示例: 1 2 3 4 5 6 7 for (int i = 0;

什么情况下应该使用Web Service?

现在我将列举三种情况,在这三种情况下,你将会发现使用Web service会带来极大的好处.此后,我还会举出不应该使用Web service的一些情况. 跨越防火墙的通信 如果你的应用程序有成千上万的用户,而且他们都分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题.那是因为客户端和服务器之间通常都会 有防火墙或者代理服务器.在这种情况下,你想使用DCOM就不是那么简单了,而且,通常你也不愿意把你的客户端程序发布到如此庞大数量的每一个用户手中. 于是,你最终选择了用浏览器作为客户端,

如何在主机自动IP而虚拟机静态IP的情况下相互ping通?

这两天在学习Linux,用xshell时,发现主机和虚拟机均不能相互ping通.自己查了一下主机是自动获取IP,而虚拟机是静态IP(默认静态).并且,虚拟机选用的是桥接方式.折腾了一会儿终于ping通了. 环境: 主机OS: win10 网络: 有线 虚拟机:VMware12.5.0 OS: RHEL 5.8 注: 一般情况下,主机默认为自动获取IP,VMware桥接情况下默认为静态IP. 步骤: (1) 给虚拟机Network Adapter设置Bridge方式,前提是虚拟机在关机情况下. 然