登录 用户中心() [退出] 后台管理 注册
 

热门搜索:
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: 调用程序的第一个菜单项
标题 调用程序的第一个菜单项
clq
浏览(3706) 2007-09-26 21:10:46 发表 编辑

关键字:

调用程序的第一个菜单项

windows 的接口实在做得不太好.本来应该是很简单的东东,结果令人极度费解.

function Tform1.get_recv_app_handle:thandle;
//得到接收程序的句柄如果为0 就表示不存在要启动

var
h1,h2:thandle;
b1:string;
b2:array[0..500] of char;
Menu_h:thandle;
Menu_h2:thandle;
info1:TMenuItemInfo;

Procedure Enable_Submenu(MainMenu:hmenu; Index:integer);
{
MainMenu:主菜单,Index:子菜单索引,从0开始.
}
var
i,Count:integer;
Current_child:hmenu;
temp_menu_info:tagMENUITEMINFO;
begin
Current_child:=getsubmenu(MainMenu,index);
Count:=GetMenuItemCount(Current_child);
temp_menu_info.cbSize:=sizeof(temp_menu_info);

temp_menu_info.fMask := MIIM_CHECKMARKS or MIIM_DATA or MIIM_FTYPE or MIIM_ID
or MIIM_STATE or MIIM_STRING or MIIM_SUBMENU or MIIM_TYPE; // 想读什么,就设什么标志

temp_menu_info.fMask:=
//MIIM_STATE;
// or
MIIM_STRING;

temp_menu_info.fType:=MFT_STRING;
temp_menu_info.dwTypeData:=' ';

temp_menu_info.cch:=0;//注意哦!

for i:=0 to count-1 do
begin
GetMenuItemInfo(Current_child,i,true,temp_menu_info);
//temp_menu_info.fState:=MFS_ENABLED;
//SetMenuItemInfo(Current_child,i,true,temp_menu_info);

GetMenuString(Current_child, i, b2, 255, MF_BYPOSITION);
showmessage(b2);

end;
end;
begin
h1:=0;//顶级窗口
h2:=GetTopWindow(h1);
setlength(b1,500);


//得到所有顶级窗体
while (h2<>0)do
begin
//隐藏的就不用了
//if IsWindowVisible(h2) then
begin

getwindowtext(h2, b2, length(b2));
if (pos('环球金融', b2)=1) then
begin
showmessage(b2);

break;
end;


//类名
GetClassName(h2, b2, length(b2));

end;

h2:=GetNextWindow(h2,GW_HWNDNEXT);
end;

Menu_h:=GetMenu(h2);
//Menu_h2:=GetSubMenu(Menu_h, 1);
// Menu_h:=GetSubMenu(Menu_h, 0);


SendMessage(Handle, WM_COMMAND, GetMenuItemID(GetSubMenu(GetMenu(Handle), 0), 1), 0);
SendMessage(Handle, WM_COMMAND, GetMenuItemID(GetSubMenu(GetMenu(Handle), 0), 0), 0);
// SendMessage(Handle, WM_COMMAND, GetMenuItemID(GetSubMenu(GetSubMenu(GetMenu(Handle), 0), 1), 0), 0);

SendMessage(h2, WM_COMMAND, GetMenuItemID(GetSubMenu(GetMenu(Handle), 0), 1), 0);
//下面这个 ok 了
SendMessage(h2, WM_COMMAND, GetMenuItemID(GetSubMenu(GetMenu(Handle), 0), 0), 0);

SendMessage(h2, WM_COMMAND, GetMenuItemID(GetSubMenu(GetMenu(Handle), 0), 1), 0);
SendMessage(h2, WM_COMMAND, GetMenuItemID(GetSubMenu(GetSubMenu(GetMenu(Handle), 0), 1), 0), 0);

exit;

GetMenuString(Menu_h, 0, b2, 255, MF_BYPOSITION);
showmessage(b2);

Enable_Submenu(Menu_h, 0);

//MemoryZero(info1, sizeof(info1));
ZeroMemory(@info1, sizeof(info1));

info1.cbSize := sizeof(info1);
info1.fMask := MIIM_BITMAP or MIIM_CHECKMARKS or MIIM_DATA or MIIM_FTYPE or MIIM_ID
or MIIM_STATE or MIIM_STRING or MIIM_SUBMENU or MIIM_TYPE; // 想读什么,就设什么标志

GetMenuItemInfo(Menu_h, 0, true, info1);

Menu_h:=info1.hSubMenu;
// Menu_h:=GetSubMenu(Menu_h, 0);
GetMenuString(Menu_h, 0, b2, 255, MF_BYPOSITION);

showmessage(b2);

end;

clq
2007-9-26 21:11:25 发表 编辑

参考自 http://topic.csdn.net/t/20030705/14/1993758.html

CSDN首页 新闻 论坛 小组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 第二书店 程序员


搜索 | 收藏 | 打印 | 关闭
CSDN社区 > VB > API
向菜单发什么消息可以实现鼠标单击它的效果?(在线等,答对立刻给分)
楼主goodname008(卢培培,充电中......)2003-07-05 14:12:34 在 VB / API 提问

问大家一个问题,当我得到一个菜单的句柄后,向它发什么消息可以实现用鼠标单击它的效果?
问题点数:20、回复次数:21
Top

1 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 14:54:32 得分 0

我一直在线啊,大家帮帮忙吧,解决问题后我马上给分。
Top
2 楼jun_01(无名小卒)
回复于 2003-07-05 15:07:03 得分 0

wm_mouseclick吧
Top
3 楼gofree2(天才狐狸)
回复于 2003-07-05 15:08:29 得分 0

发送wm_lbuttondown消息~
Top
4 楼jun_01(无名小卒)
回复于 2003-07-05 15:08:36 得分 0

如果不对,别怪我,呵呵
Top
5 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 15:10:12 得分 0

WM_MOUSECLICK ?
API viewer里没有这个常量的值啊?您试了吗?有没有代码?
Top
6 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 15:22:49 得分 0

WM_MOUSECLICK 没找到这个消息的常量!!!
WM_LBUTTONDOWN 我试了,不行啊!!!

大家还有没有别的办法,帮帮我吧,很急的!!!!!!!!!!!
大家如果有时间最后能帮着调试一下,如果成功就把代码贴上来,谢谢!!!!!!
Top
7 楼liu_swallow(swallow)
回复于 2003-07-05 16:19:15 得分 0

就是Wm_lbuttondown ,用Msdn 查一下
Top
8 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 16:32:18 得分 0

大家帮帮忙吧,有没有源代码啊?
Top
9 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 16:51:10 得分 0

我查MSDN了,不行啊!!!!!!!!
补充一下,我得到的菜单句柄是另外一个程序的菜单!
大家有没有源码贴一下啊??
Top
10 楼ClassicWuHao(Mouse)
回复于 2003-07-05 17:33:13 得分 0

应该是wm_command,MSDN里说得很清楚了,The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated
Top
11 楼mjcom(不明飞行物)
回复于 2003-07-05 19:04:26 得分 0

不可以的,知道了句柄不行,而要知道它在程序中的ID才行,因为程序的处理是这样的:
Wndproc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
.if uMsg==WM_COMMAND
.if wParam==1 ;这是按键的ID
....
.endif
.endif
Wndproc endp
Top
12 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 19:15:49 得分 0

大家是不是没明白啊!
我要实现的是通过我的VB程序单击另外一个程序中的菜单!!!
现在我已经知道了那个菜单的句柄,用SendMessage怎么向这个句柄发消息才能实现用鼠标单击这个菜单的效果??????????

比如我通过VB先启动了超级解霸,然后又获得了“文件”菜单下的“打开单个文件”菜单的句柄,现在我想通过SendMessage向它发个类似[单击]的消息实现和用鼠标单击该菜单一样的效果。

不知道说清楚没有。


Top
13 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 20:49:05 得分 0

UP

我快哭了,大家帮帮我啊!!!
Top
14 楼lylmsdn(创影)
回复于 2003-07-05 21:14:41 得分 0

如果是用VB的菜单的话直接调用那个过程了,如果API写的话就不行了。
Top
15 楼goodname008(卢培培,充电中......)
回复于 2003-07-05 21:17:54 得分 0

是啊,我得到的是另外一个程序的菜单的句柄,我现在想实现用鼠标单击该菜单的效果。
应该用 SendMessage 发消息,但我不知道后面具体的参数怎么写?

大家帮帮忙!!!!!
Top
16 楼sippey(sippey)
回复于 2003-07-06 00:09:10 得分 0

gz

Top
17 楼James0001(虾米—什么时候成大虾?)
回复于 2003-07-06 03:07:01 得分 0

你是怎样得到那个菜单句柄的?
如果你知道含有那个菜单的窗口的话,可以用 WM_COMMAND :
SendMessage( 窗口句柄, WM_COMMAND, 菜单句柄, ByVal 0& )
Top
18 楼goodname008(卢培培,充电中......)
回复于 2003-07-06 12:43:08 得分 0

to: James0001(See-Plus-Plus)
帮我看看我的做法有问题吗?我试了不行啊,handle 就是那个窗口的句柄。

SendMessage Handle, WM_COMMAND, GetSubMenu(GetSubMenu(GetMenu(Handle), 0), 1), ByVal 0&
Top
19 楼James0001(虾米—什么时候成大虾?)
回复于 2003-07-07 03:14:45 得分 18

那个菜单有几级?
试试这个:
SendMessage Handle, WM_COMMAND, GetMenuItemID(GetSubMenu(GetMenu(Handle), 0), 1), ByVal 0&
或这个:
SendMessage Handle, WM_COMMAND, GetMenuItemID(GetSubMenu(GetSubMenu(GetMenu(Handle), 0), 1), 0), ByVal 0&

Top
20 楼ClassicWuHao(Mouse)
回复于 2003-07-07 17:55:52 得分 2

由于时间有限,我做了一个向系统菜单发送单击消息的试验代码如下:
===============================================================================
Option Explicit
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function GetMenuItemID Lib "user32.dll" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Const WM_SYSCOMMAND As Long = &H112

Private Sub Command1_Click()
Dim hMenu As Long, Rc As Long
Dim SubMenuID As Long

hMenu = GetSystemMenu(Me.hwnd, 0&)
SubMenuID = GetMenuItemID(hMenu, 4&)
Debug.Print "SubMenuID"; SubMenuID
Rc = SendMessage(Me.hwnd, WM_SYSCOMMAND, SubMenuID, ByVal 0&)
Debug.Print "Rc"; Rc '注意返回0(有点怪)
End Sub
==================================================================================希望对你有帮助!!!!

Top
21 楼goodname008(卢培培,充电中......)
回复于 2003-07-09 13:49:33 得分 0

谢谢大家了,James0001(See-Plus-Plus) 的方法是正确的。
原来第三个参数应该是菜单的ID而不是菜单的句柄。
现在终于明白了!!! 再次谢谢大家!!! :)
结贴,放分。
Top
相关问题
求教!单击鼠标左键出现单击鼠标右键才能出现的快捷菜单,怎么办?
鼠标单击 怎么老是双击的效果?
用鼠标右键单击文本框(Text1)弹出的菜单问题?????????????????
如何用鼠标操作帮助菜单???(不相应鼠标的单击事件!)
如果禁止网页上当单击鼠标右键时菜单的出现(使右键菜单不效)
所谓菜单项选中,是指鼠标停在那个菜单项上,还没单击?
上下方向键移动如何实现鼠标单击的效果?
单击鼠标的右键为什么没有弹出菜单来,请看看下面的代码。
鼠标移动到菜单上(但没有单击)时,发送的是什么消息?
如何在按钮上单击鼠标左键弹出一个菜单?(必给分)
关键词
鼠标
消息
效果
代码
句柄
菜单
鼠标单击
单击
getsubmenu
sendmessage
得分解答快速导航
帖主:goodname008
James0001
ClassicWuHao
相关链接
Visual Basic类图书
Visual Basic类源码下载
广告也精彩

反馈
请通过下述方式给我们反馈


网站简介-广告服务-网站地图-帮助-联系方式-诚聘英才-English-问题报告
北京百联美达美数码科技有限公司 版权所有 京 ICP 证 020026 号
Copyright © 2000-2006, CSDN.NET, All Rights Reserved


总数:1 页次:1/1 首页 尾页  


发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:




Copyright © 2005-2012 CLQ工作室, All Rights Reserved

CLQ工作室 版权所有