Word 的菜单不是直接存在于Word的主窗口中,而是在子窗口中, 下面的代码验证了这一点: ------------------------------------------------------ var hWord, hCommandDock, hCommand: HWND; begin // Word 的窗口 hWord := FindWindow( 'OpusApp', nil ); // 上部的菜单、工具栏部分 hCommandDock := FindWindowEx( hWord, 0, 'MsoCommandBarDock', 'MsoDockTop' ); // 菜单栏 hCommand := FindWindowEx( hCommandDock, 0, 'MsoCommandBar', '菜单栏' ); ------------------------------------------------------理论上GetMenu的参数应该是 hCommand, 但GetMenu不支持对子窗口的调用。 下面是MSDN原文: The return value is a handle to the menu. If the specified window has no menu, the return value is NULL. If the window is a child window, the return value is undefined.
我能用SPY++或WindowFromPoint函数找到菜单的句柄(但工具栏上的按钮找不到句柄),菜单项的从属关系也知道(上面已经列出来了),但是我没有办法根据它的父来枚举出所有项目,而这是我想达到的功能,菜单还好办,能得到句柄(WORD的菜单不是WINDOWS的MENU类,IE的好象也不是,还没试验),但工具栏按钮就根本得不到句柄,别说根据父类枚举出它们了. to 阿木 其实你不用问,自己试试就知道了,SPY++枚举子窗口的功能我已实现,其实很简单,就是它也不知道怎么得到这些句柄,从WORD应用程序的句柄开始,它只能得到工具栏等的句柄,而不能得到菜单句柄和工具栏按钮的句柄,你用一下SPY++会发现一个WORD应用程序的结构很简单,而实际上是它根本没有办法得到详细的信息.
下面的代码验证了这一点:
------------------------------------------------------
var
hWord, hCommandDock, hCommand: HWND;
begin
// Word 的窗口
hWord := FindWindow( 'OpusApp', nil );
// 上部的菜单、工具栏部分
hCommandDock := FindWindowEx( hWord, 0, 'MsoCommandBarDock', 'MsoDockTop' );
// 菜单栏
hCommand := FindWindowEx( hCommandDock, 0, 'MsoCommandBar', '菜单栏' );
------------------------------------------------------理论上GetMenu的参数应该是 hCommand, 但GetMenu不支持对子窗口的调用。
下面是MSDN原文:
The return value is a handle to the menu. If the specified window
has no menu, the return value is NULL. If the window is a child
window, the return value is undefined.
菜单栏用EnumChildWindows可以找到,但再Enum不出菜单项了
像放在工具条中的菜单,如IE的,都找不到名柄
我现在连主菜单的句柄都找不到,怎么能GetSubMenu???Word的菜单与众不同(我是Office XP)
工具栏上的菜单项,如文件菜单项的隶属关系是
OpusApp (WORD应用程序)
MsoCommandBarDock (停靠的地方)
MsoCommandBar (工具栏菜单项)而下拉的菜单竟然直接隶属于WORD应用程序???!!!!!
OpusApp (WORD应用程序)
MsoCommandBarPopup (弹出菜单项,如文件中的打开...)而IE中的菜单(就是我的电脑)更牛了
主菜单的隶属关系是
CabinetWClass (我的电脑)
WorkerW (未知,应是工具栏的停靠控件吧)
ReBarWindow32 (工具栏)
ToolBarWindow32 (主菜单,如文件)文件中的新建菜单类名是
#32768
竟然没有父窗口???!!!晕倒我该怎么取出来???
我并不只想取得WORD和IE的菜单句柄,还有其它所有未知应用程序的菜单句柄我用EnumChildWindow枚举所有子窗体,用GetMenu取得菜单,但像上面的情况,
我应该用什么方法取得句柄呢?不止菜单,像上面的ToolBarWindow32中的按钮
的句柄也取不到!不可能所有用ToolBarWindow32控件的应用程序都提供接口吧回答正确者在大富翁里可再得300分
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1614265
to 阿木
其实你不用问,自己试试就知道了,SPY++枚举子窗口的功能我已实现,其实很简单,就是它也不知道怎么得到这些句柄,从WORD应用程序的句柄开始,它只能得到工具栏等的句柄,而不能得到菜单句柄和工具栏按钮的句柄,你用一下SPY++会发现一个WORD应用程序的结构很简单,而实际上是它根本没有办法得到详细的信息.
那你得到的MENU的handle是什么东东
如果你想做个通用的取菜单的东西
恐怕得分开来判断才行
有不少软件都不是直接封装的MENU类
自己用别的方法实现的菜单
有一个函数ismenu用来判断它是不是一个菜单
如果你取得根本不是菜单那没用了
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1435428
好吧,现在放弃取WORD菜单的想法了,但还想取IE的菜单,相信应该有办法吧
注意,我是要根据窗口的句柄取出其菜单句柄!
还有,到底工具栏中的按钮有没有句柄?有没有人取到过?