用sendmessage发送菜单消息

时间:2021-09-23 19:32:18
我想用sendmessage函数发送一个保存消息.就是和我们按下了保存按钮的功能一样...
应该怎么发送.MFC中没有定义保存发送消息如:SendMessage( ,WM_CLOSE,,), WM_CLOSE表示关闭.
但是,没有保存的消息(像:WM_CLOSE)代码.应该怎么样定义消息.
希望给出具体步骤..谢谢...

15 个解决方案

#1


可以利用自定义消息实现,sendmessage函数可以发送自定义消息。

#2


如果是别人的程序恐怕要用HOOK实现了。

#3


自定义消息WM_USER+X  ,然后再接收消息的窗口手动添加响应消息函数就OK了

#4


可以发送命令消息:SendMessage(
  HWND hWnd,      // 窗口句柄
  UINT Msg,       // 这个参数写 WM_COMMOND
  WPARAM wParam,  // 自定义消息WM_USER+X
  LPARAM lParam   // 参数 高位+低位
);

#5


保存消息,得看程序有没有以及怎么实现的,没有标准的Windows保存消息啊。一般MFC程序可以尝试用ID_FILE_SAVE这个命令ID。

#6


SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL)

如果是自己的程序,直接从资源查找到相应得ID,MFC程序默认是ID_FILE_SAVE,0xE103,57603。

如果是别人的程序,那必须要是特定的程序,没有源码的话可以按下面的步骤找:在VC里打开目标exe文件,在Open对话框的Open As选项上选Resources, 这样就可以打开程序的资源,然后找到菜单项,可以查到相应菜单命令ID

#7


引用 6 楼 zhangyan_wt 的回复:
SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL) 

如果是自己的程序,直接从资源查找到相应得ID,MFC程序默认是ID_FILE_SAVE,0xE103,57603。 

如果是别人的程序,那必须要是特定的程序,没有源码的话可以按下面的步骤找:在VC里打开目标exe文件,在Open对话框的Open As选项上选Resources, 这样就可以打开程序的资源,然后找到菜单项,可以查到相应菜单命令ID


如果不是VC编写的呢,比如:Delphi编写的呢. 

#8


别人的程序就用FindWindowEx找到句柄后再SendMessage得了

#9


自己的程序..如果在自定义消息的话.最好写详细点呢...SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL) 我试过了呢..没什么改变...

#10


SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL)中的hWnd是哪个的句柄??菜单?按钮?还是哪个窗口?

#11


主窗口的句柄
SendMessage(AfxGetMainWnd()->m_hWnd, WM_COMMAND, ID_FILE_SAVE, 0);
或者直接
AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);

#12


晕,这么简单的问题还问!
直接给你贴代码算了!
#define WM_SAVE WM_USER+1

在点击保存按钮的响应事件中添加
SendMessage(hwnd,WM_SAVE,0,0);//hwnd为接收消息的窗口句柄

在消息处理程序中添加(一般都是回调函数,由操作系统调用)
case WM_SAVE:
    SaveFileToDisk();//该函数自己定义,怎么实现我想你应该知道,很简单
     return 0;

#13


可以的,用WM_COMMAND消息就行了,记得WPARAM要2个参数的(用 MAKEWPARAM就好了)
这样写:
SendMessage(WM_COMMAND,MAKEWPARAM(ID_BUTTON,BN_CLICK),NULL);我经常这样做的,自定义消息多麻烦啊

WM_COMMAND
wParam
  The  high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero. 
  The  low-order word specifies the identifier of the menu item,  control, or accelerator. 

lParam
  Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL. 

#14


不好意思,写错了一点不是BN_CLICK而是BN_CLICKED,按钮的点击消息啊,对菜单也可以这样做
SendMessage(WM_COMMAND,MAKEWPARAM(ID_BUTTON,BN_CLICKED),NULL);

#15


刚刚测试完成正确可用的代码
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(XXXX,BN_CLICKED),NULL);

XXXX可以是菜单标识如数字123,也可以是菜单的ID_XXXX这样的形式

如果是ID_XXX的形式需要详细的进行预定义

#1


可以利用自定义消息实现,sendmessage函数可以发送自定义消息。

#2


如果是别人的程序恐怕要用HOOK实现了。

#3


自定义消息WM_USER+X  ,然后再接收消息的窗口手动添加响应消息函数就OK了

#4


可以发送命令消息:SendMessage(
  HWND hWnd,      // 窗口句柄
  UINT Msg,       // 这个参数写 WM_COMMOND
  WPARAM wParam,  // 自定义消息WM_USER+X
  LPARAM lParam   // 参数 高位+低位
);

#5


保存消息,得看程序有没有以及怎么实现的,没有标准的Windows保存消息啊。一般MFC程序可以尝试用ID_FILE_SAVE这个命令ID。

#6


SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL)

如果是自己的程序,直接从资源查找到相应得ID,MFC程序默认是ID_FILE_SAVE,0xE103,57603。

如果是别人的程序,那必须要是特定的程序,没有源码的话可以按下面的步骤找:在VC里打开目标exe文件,在Open对话框的Open As选项上选Resources, 这样就可以打开程序的资源,然后找到菜单项,可以查到相应菜单命令ID

#7


引用 6 楼 zhangyan_wt 的回复:
SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL) 

如果是自己的程序,直接从资源查找到相应得ID,MFC程序默认是ID_FILE_SAVE,0xE103,57603。 

如果是别人的程序,那必须要是特定的程序,没有源码的话可以按下面的步骤找:在VC里打开目标exe文件,在Open对话框的Open As选项上选Resources, 这样就可以打开程序的资源,然后找到菜单项,可以查到相应菜单命令ID


如果不是VC编写的呢,比如:Delphi编写的呢. 

#8


别人的程序就用FindWindowEx找到句柄后再SendMessage得了

#9


自己的程序..如果在自定义消息的话.最好写详细点呢...SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL) 我试过了呢..没什么改变...

#10


SendMessage( hwnd, WM_COMMAND, ID_xxx, NULL)中的hWnd是哪个的句柄??菜单?按钮?还是哪个窗口?

#11


主窗口的句柄
SendMessage(AfxGetMainWnd()->m_hWnd, WM_COMMAND, ID_FILE_SAVE, 0);
或者直接
AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_SAVE);

#12


晕,这么简单的问题还问!
直接给你贴代码算了!
#define WM_SAVE WM_USER+1

在点击保存按钮的响应事件中添加
SendMessage(hwnd,WM_SAVE,0,0);//hwnd为接收消息的窗口句柄

在消息处理程序中添加(一般都是回调函数,由操作系统调用)
case WM_SAVE:
    SaveFileToDisk();//该函数自己定义,怎么实现我想你应该知道,很简单
     return 0;

#13


可以的,用WM_COMMAND消息就行了,记得WPARAM要2个参数的(用 MAKEWPARAM就好了)
这样写:
SendMessage(WM_COMMAND,MAKEWPARAM(ID_BUTTON,BN_CLICK),NULL);我经常这样做的,自定义消息多麻烦啊

WM_COMMAND
wParam
  The  high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero. 
  The  low-order word specifies the identifier of the menu item,  control, or accelerator. 

lParam
  Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL. 

#14


不好意思,写错了一点不是BN_CLICK而是BN_CLICKED,按钮的点击消息啊,对菜单也可以这样做
SendMessage(WM_COMMAND,MAKEWPARAM(ID_BUTTON,BN_CLICKED),NULL);

#15


刚刚测试完成正确可用的代码
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(XXXX,BN_CLICKED),NULL);

XXXX可以是菜单标识如数字123,也可以是菜单的ID_XXXX这样的形式

如果是ID_XXX的形式需要详细的进行预定义