在指定的窗口中查找某个子窗口或者控件

combobox2013 2013-10-28 07:45:22
群里讨论一个技术问题:

用函数 findowex(任务栏句柄,null, "button", NULL); 用这个法子获取 任务栏左侧的那个win徽标按钮失败

结果失败了。

不明白原因,还有spy++观察了,这个按钮的父窗口确实是任务栏,而且该按钮的风格居然是wm_popup.

我做过实验,如果一般的按钮用wm_popup风格,程序直接崩溃。


根据一些经验: findowex是一个没有保存查询记录的功能,说白就是查询一次, 如果没有查到则遍历所有,

查到立即返回。


由于任务栏 中中只有一个按钮, 那么猜测获取到是必然成功的。 事实上,却无法获取到。


我刚才又新建了一个工程测试,这个法子绝对可以获取到按钮的句柄的。

但是为什么这个法子无法获取到 任务栏左侧的那个win图标呢。


...全文
660 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
红色代码 2013-11-09
  • 打赏
  • 举报
回复
引用 7 楼 combobox2013 的回复:
traynotifywnd下倒是有个button,不过 该button的标题不是“开始”,而是空字符串。

至于你说的空标题的按钮,是在控制面板-通知区域图标里,当去掉了最下面的"始终在任务栏上显示所有程序和图标"复选框后,右下角出来的倒三角的按钮...之前也有这个疑惑,今天正好彻底搞个清楚
红色代码 2013-11-09
  • 打赏
  • 举报
回复
Win7
		HWND hDesktop =::GetDesktopWindow();
		HWND hStart =::FindWindowEx( hDesktop, NULL, _T( "Button" ), _T( "开始" ) );
		if ( NULL != hStart )
		{
			::EnableWindow( hStart, TRUE );
		}
红色代码 2013-11-09
  • 打赏
  • 举报
回复
在Win7中开始菜单(类名:Button)不再是任务栏(类名:Shell_TrayWnd)的子类,所以只需要直接寻找这两个类的句柄 HWND hWnd = FindWindow(L"Shell_TrayWnd",NULL); HWND hStar =FindWindow(L"Button",NULL); XP下开始菜单按钮还是属于Shell_TrayWnd的子窗口,所以查找方法不一样
combobox2013 2013-11-04
  • 打赏
  • 举报
回复
引用 7 楼 combobox2013 的回复:
[quote=引用 6 楼 zwfgdlc 的回复:] 我用GetDlgItem试了下,能找到句柄.

HWND hwnd = ::GetDlgItem(FindWindow(TEXT("Shell_TrayWnd"), NULL), 0x130);
我的是win7,用spy++模仿你的,看了一下 发现shell_traynwd下有: traynotifywnd rebarwindow32 还有tooltips_class32等子窗口 traynotifywnd下倒是有个button,不过 该button的标题不是“开始”,而是空字符串。 然后我跳出在shell_traywnd外,观察所有窗口,居然发现 开始按钮在哪里了? 是在桌面的那棵树哪里: 观看这个button的属性是: ws_popup ,wm_visiable, bs_pushbotton,bs_text 等 于是我有2个问题: 1.按钮到底可以不可以为wm_popup ? 试过,创建一个对话框,然后对按钮进行这种风格的设置的话,会崩溃 所以才有这个疑问 2. 尽管这个按钮在spy++中,没有在shell_traywnd下出现,但是我们右键看属性,还是会 发现该按钮的 父窗口依然是shell_traywnd。 为什么spy++会把它放到 shell_traywnd外 ,原因不详细,也不想追究。 我想知道的: 既然是一个shell_traywnd的子控件,那么就可以用 findwindowex来获取到句柄. 试试上,无法获取 以上是本菜鸟的2个问题,望各位大大解答 [/quote]
allenltiverson 2013-11-03
  • 打赏
  • 举报
回复
FindowWindow似乎只能查找顶层窗口
combobox2013 2013-11-03
  • 打赏
  • 举报
回复
引用 6 楼 zwfgdlc 的回复:
我用GetDlgItem试了下,能找到句柄.

HWND hwnd = ::GetDlgItem(FindWindow(TEXT("Shell_TrayWnd"), NULL), 0x130);
我的是win7,用spy++模仿你的,看了一下 发现shell_traynwd下有: traynotifywnd rebarwindow32 还有tooltips_class32等子窗口 traynotifywnd下倒是有个button,不过 该button的标题不是“开始”,而是空字符串。 然后我跳出在shell_traywnd外,观察所有窗口,居然发现 开始按钮在哪里了? 是在桌面的那棵树哪里: 观看这个button的属性是: ws_popup ,wm_visiable, bs_pushbotton,bs_text 等 于是我有2个问题: 1.按钮到底可以不可以为wm_popup ? 试过,创建一个对话框,然后对按钮进行这种风格的设置的话,会崩溃 所以才有这个疑问 2. 尽管这个按钮在spy++中,没有在shell_traywnd下出现,但是我们右键看属性,还是会 发现该按钮的 父窗口依然是shell_traywnd。 为什么spy++会把它放到 shell_traywnd外 ,原因不详细,也不想追究。 我想知道的: 既然是一个shell_traywnd的子控件,那么就可以用 findwindowex来获取到句柄. 试试上,无法获取 以上是本菜鸟的2个问题,望各位大大解答
zwfgdlc 2013-11-03
  • 打赏
  • 举报
回复
我用GetDlgItem试了下,能找到句柄.

HWND hwnd = ::GetDlgItem(FindWindow(TEXT("Shell_TrayWnd"), NULL), 0x130);

combobox2013 2013-10-31
  • 打赏
  • 举报
回复
引用 3 楼 combobox2013 的回复:
[quote=引用 1 楼 VisualEleven 的回复:] Spy++看看,FindWindow/FindWindowEx()/GetWindow/EnumWindows/EnumChildWindows()
引用 2 楼 xianglitian 的回复:
那个按钮没名字么? 为什么不直接FindWindow呢
spy++ 看了,名字就叫“开始” 这是中文版本的操作系统。 我回答你为什么不用findwindows, 原因,该函数只能查找 top-level的窗口, 作为子窗口的按钮,自然不行 [/quote] 顶起来,有人 不
combobox2013 2013-10-29
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
Spy++看看,FindWindow/FindWindowEx()/GetWindow/EnumWindows/EnumChildWindows()
引用 2 楼 xianglitian 的回复:
那个按钮没名字么? 为什么不直接FindWindow呢
spy++ 看了,名字就叫“开始” 这是中文版本的操作系统。 我回答你为什么不用findwindows, 原因,该函数只能查找 top-level的窗口, 作为子窗口的按钮,自然不行
向立天 2013-10-29
  • 打赏
  • 举报
回复
那个按钮没名字么? 为什么不直接FindWindow呢
Eleven 2013-10-29
  • 打赏
  • 举报
回复
Spy++看看,FindWindow/FindWindowEx()/GetWindow/EnumWindows/EnumChildWindows()

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧