两个程序间消息传递的问题!

wfu 2002-06-08 03:30:27
我在程序中启动了一个外部程序abc.exe.在取得外部程序的句柄后,使用AppendMenu(),往这个外部程序里加了一个菜单,代码如下:
WinExec("E:\\Kodak\\XVCS\\MVCS.exe", SW_SHOW);
HWND hwnd;
HWND myhwnd;
char *title;
title =new char[255];
int len;
AnsiString Msg;
Sleep(1000);
bool Loop;
Loop=true;
myhwnd=GetActiveWindow();
do
{
hwnd=GetForegroundWindow();
GetWindowText(hwnd,title,len);
Msg=AnsiString(title);
if(Msg.SubString(1,3)=="Mid")
Loop=false;
}while(Loop);
int MenuPos;
HMENU MVCXMenu;
MVCXMenu=GetMenu(hwnd);
MenuPos=GetMenuItemCount(MVCXMenu);
AppendMenu(MVCXMenu,MF_BYPOSITION,MenuPos,"菜单1");

HMENU MyMenu;
MyMenu=GetSubMenu(MVCXMenu,MenuPos);
InsertMenu(MyMenu,0,MF_BYPOSITION,1,"menu1");
InsertMenu(MyMenu,1,MF_BYPOSITION,0,"menu2");
InsertMenu(MyMenu,2,MF_BYPOSITION,0,"menu3");
DrawMenuBar(hwnd);
delete [] title;
现在的问题是:

1、第一级菜单“菜单1”添加成功,而下面的子菜单“menu1”“menu2”“ menu3”添加没成功!
2、菜单添加后怎样响应用户单击我增加的“菜单1”的事件?也就是怎样捕获用户单击我增加的“菜单1”的消息?

...全文
47 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2002-06-11
  • 打赏
  • 举报
回复
用钩子函数的方法。你必须写一个DLL,然后你的程序需要调用DLL的函数
SetMonitorWnd(HWND hwnd),这儿参数hWnd就是你要控制的程序的窗口句
柄。下面给你DLL的源程序:

#include <windows.h>

HWND hWnd=NULL;
HHOOK hHook=NULL;

void __export SetMonitorWnd(HWND hwnd)
{
char buf[33];

wsprintf(buf, "MonitorWnd=%u", (int)hwnd);
GlobalAddAtom(buf); hWnd = hwnd;
}

ATOM GetWndAtom(HWND hwnd)
{
char buf[33];

wsprintf(buf, "MonitorWnd=%u", (int)hwnd);
return GlobalFindAtom(buf);
}

LRESULT CALLBACK MsgProc(int code, WPARAM wParam, LPARAM lParam)
{
MSG* pMsg = (MSG*)lParam;
if (pMsg->message==WM_COMMAND && GetWndAtom(pMsg->hwnd)) {
//这儿写你的程序代码。其中LOWORD(pMsg->wParam)就是菜单的ID
}
return code<0 ? CallNextHookEx(hHook,code,wParam,lParam) : 0;
}

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if (reason==DLL_PROCESS_ATTACH) {
if (hHook == NULL)
hHook = SetWindowsHookEx(
WH_GETMESSAGE, (HOOKPROC)
MsgProc, hinst, NULL);
}
else if(reason==DLL_PROCESS_DETACH) {
if (hHook != NULL) {
UnhookWindowsHookEx(hHook);
hHook = NULL;
}
GlobalDeleteAtom(GetWndAtom(hWnd));
}
return 1;
}
wfu 2002-06-10
  • 打赏
  • 举报
回复
钩子也没“钩”到!见我另一贴:

http://www.csdn.net/expert/topic/790/790724.xml?temp=.5507471
wfu 2002-06-09
  • 打赏
  • 举报
回复
: wltom(我是棒棒) :
我的菜单是加在另一个外部程序里的呀!可以这样吗?
wltom 2002-06-09
  • 打赏
  • 举报
回复
用指针函数,我程序里的菜单全是动态生成的。提供一段我程序中的代码给你。
应该会解决这个问题的。
TMainMenu *Menu=f_newform->Menu;
TMenuItem *MenuItem1,*MenuItem2;

for(int i=0;i<DEFAULT_MENU_NUMBER;i++)
{
MenuItem1=new TMenuItem(Menu);
MenuItem1->Caption=DefaultMenu[i].MainCaption;
Menu->Items->Add(MenuItem1);
MenuItem2=MenuItem1;
for(int j=0;j<DefaultMenu[i].SubMenuNumber;j++)
{
MenuItem1=new TMenuItem(MenuItem2);
MenuItem1->Caption=DefaultMenu[i].SubMenuCaption[j];
MenuItem1->ShortCut=TextToShortCut(DefaultMenu[i].SubMenuShortCut[j]);
MenuItem1->Tag=DefaultMenu[i].SubMenuID[j];
MenuItem1->OnClick=&(f_newform->MenuClick);
MenuItem2->Add(MenuItem1);
}
}

MenuItem1->OnClick=&(f_newform->MenuClick);这句话就是你菜单要响应的事件。
wfu 2002-06-09
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) :
小弟刚刚入门,关于钩子函数也只听过,从来没做过。能将详细点吗?我也去看看关于钩子函数的内容!
COKING 2002-06-09
  • 打赏
  • 举报
回复
NO!
1“要么钩子!
2:要么动态修改外部程序的代码,用ice跟踪( cracker级水平的),包你晕倒!

钩子简单,查一下已往贴子!
jishiping 2002-06-09
  • 打赏
  • 举报
回复
关于第二个问题,如果你非要实现的话,我提供一个思路,用钩子函数。
SetWindowsHookEx(WH_GETMESSAGE, ....);

SetWindowsHookEx(WH_MSGFILTER, ....);
wfu 2002-06-08
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) :
关于第二个问题:“如果程序本身没有写函数响应这些菜单的ID发出的命令,那么是无法让程序本身响应用户单击这些新加的菜单命令。”是指什么?
在我的程序里可以写这些函数吗?(外部程序是别人的是没法改的!)
: kingcaiyao(AKing) :
能说详细点吗?
kingcaiyao 2002-06-08
  • 打赏
  • 举报
回复
你要响应菜单的事件,那么需要动态生成,用指针来操作.
jishiping 2002-06-08
  • 打赏
  • 举报
回复
关于第一个问题:
//。。。。。。
HMENU MVCXMenu=GetMenu(hwnd);
HMENU hSubMenu = CreatePopupMenu();
AppendMenu(MVCXMenu,MF_POPUP,(UINT)hSubMenu,"菜单1");

//添加子菜单
InsertMenu(hSubMenu,0,MF_BYPOSITION,101,"menu1");
InsertMenu(hSubMenu,1,MF_BYPOSITION,102,"menu2");
InsertMenu(hSubMenu,2,MF_BYPOSITION,103,"menu3");
DrawMenuBar(hwnd);
关于第二个问题:
由于菜单是其它程序通过动态方法添加的,所以如果程序本身没有写
函数响应这些菜单的ID发出的命令,那么是无法让程序本身响应用户单击
这些新加的菜单命令。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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