如何用sendmessage和postmessage来对获取句柄的控件发送控件的函数 比如我获取到一个对话框的句柄,但是内部有个public的test()函数此时如何用sendmessage或postmessage进行操作 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的test()函数在那个Dialog里是怎么调用的,是通过按钮吗?如果是通过按钮调用的你可以通过下面的方式来发送消息!SendMessage(hDlg,WM_COMMAND,ID_YOURBUTTON,hYourButton);PostMessage(hDlg,WM_COMMAND,ID_YOURBUTTON,hYourButton);hDlg:你的对话框的句柄WM_COMMAND:命令消息ID_YOURBUTTON:你的按钮的IDhYourButton:你的按钮的句柄使用上面的形式发送消息的前提是你必须知道你的按钮的句柄,说实话这种方式很麻烦既然你的test()函数是public的,你为什么不用下面的这种方式呢?CYourDlg dlg;dlg.test();这种方式比较简单!希望上面的对你有所帮助! 我主要是在程序A中获取到程序B中某个控件的句柄,希望在程序A中来控制程序B中的控件,而且这个控件(比如:自己写的一个控件)可能没有通用的消息(比如你说的WM_COMMAND之类的消息),只有内部的成员函数,此时要如何去控制这个自定义的控件呢??隐约中好象可以使用WM_COPYDATA的消息。但是不明白如何使用 要通过自定义消息来实现,搜索到以下两篇文章,你看一下: mafangsan(mafangsan) ( ) 信誉:100 2003-7-8 10:41:29 得分:20 定义消息向CmainFrame的头文件中添加消息的定义语句。 #define WM_SHELLMESSAGE WM_USER+100添加消息处理函数在CMainFrame的头文件的AFX_MSG块中添加消息处理函数声明:afx_msg void OnWmShellMessage(WPARAM wParam,LPARAM lParam);消息映射在CMainFrame类的CPP文件中用ON_MESSAGE宏指令将消息WM_MYSHELLMESSAGE映射到消息处理函数OnWmShellMessage。BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_MESSAGE(WM_SHELLMESSAGE,OnWmShellMessage) //}}AFX_MSG_MAPEND_MESSAGE_MAP() : dzqsuper(丁轲) ( ) 信誉:100 2003-7-8 11:49:56 得分:10 内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0通过消息来实现内部进程通信。 一、Windows消息机制 Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(message queue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为: typedef struct tagMSG{ HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; }MSG; 其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32 API有对应的函数: PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。 二、主控程序的实现 (1)新建一工程文件:Sender,选取MFC AppWizard(exe)。 (2)第二步选取Single document(单文档)。 (3)其余几步均为确省值。 (4)添加三个菜单"命令一"、"命令二"、"命令三"及与之对应的函数: OnSendComm1() { CString str="Receiver"; CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,0,0); } OnSendComm2() { CString str="Receiver"; CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,0,1); } OnSendComm3() { CString str="Receiver"; CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,1,0); } (5)在SenderView.h中添加自定义消息:#define WM_COMM WM_USER+100编译完成即可。 三、底层工作程序的实现 (1)新建工程Receiver、仍是单文档。 (2)在CReceiverApp类的InitInstance()函数末尾添加: m_pMainWnd->SetWindowText("Receiver"); 用以指定底层工作程序的窗口标题,以便主控程序能根据标题获取到此窗口的窗口句柄。 (3)在MainFrm.h中添加自定义消息:#define WM_COMM WM_USER+100。 (4)添加自定义消息WM_COMM的消息映射: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP ON_MESSAGE(WM_COMM,OnSendMsg) END_MESSAGE_MAP() (5)完成消息响应函数OnSendMsg() void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam) { if(wParam==0 && lParam==0) AfxMessageBox("主控程序发送命令一!"); if(wParam==0 && lParam==1) AfxMessageBox("主控程序发送命令二!"); if(wParam==1 && lParam==0) AfxMessageBox("主控程序发送命令三!"); } 我们便可以通过辨别消息的两个消息参数来区分主控程序发送的是哪一个命令从而可以执行相应的操作。执行主控程序和底层工作程序由于本程序采用的是SendMessage()所以当主控程序发送消息给底层工作程序时,底层工作程序弹出响应的模式对话框,在没有关闭对话框前此消息未处理完,SendMessage()也就没有执行完,所以主控程序呈阻塞状态,如改用PoseMessage()则不会发生阻塞,具体选用哪个函数还应根据实际要求灵活掌握。 结论: 通过上面的实例可以看出利用消息进行进程间通信不失为一种便捷的方法,进程间的数据交换量不大却能完成相当的功能,上下层次有着明显的接口,上层和底层只通过这个接口进行通讯,因此只要对上下层程序制定好规范详尽的协议便可编制出协调性很好的软件控制系统。 我同意bluebohe(薄荷) .函数只是C++语言的概念,它不是Windows编程中的元素.所以你得到Handle也只能通过与HANDLE相关的API来控制它.而这个HANDLE和你的函数之间是无关的.(函数属于你包装HANDLE的那个类). 两个列表框怎么关联,每个只能有15个元素,把第一个中多余的放在第二个中 MFC 自定义类 实例化在哪 多进度条配合多线程的问题 virtual 析构函数 纯SDK开发,只为得到C++标准的良好支持,从VS6转到VS2003还是VS2005好? 使用ado连接数据库,Connection对象调用CreateInstance返回值为零,这是什么问题呀? 调试问题 怎样实现把listview的数据导出到execel中,反之也可以?(给分) 如何保存图形 vb script中split用后如何知道返回得数组得index 在VC中用ODBC读写EXCEL文件的奇怪问题!紧急啊紧急!! 急
如果是通过按钮调用的你可以通过下面的方式来发送消息!
SendMessage(hDlg,WM_COMMAND,ID_YOURBUTTON,hYourButton);
PostMessage(hDlg,WM_COMMAND,ID_YOURBUTTON,hYourButton);
hDlg:你的对话框的句柄
WM_COMMAND:命令消息
ID_YOURBUTTON:你的按钮的ID
hYourButton:你的按钮的句柄
使用上面的形式发送消息的前提是你必须知道你的按钮的句柄,说实话这种方式很麻烦
既然你的test()函数是public的,你为什么不用下面的这种方式呢?
CYourDlg dlg;
dlg.test();
这种方式比较简单!希望上面的对你有所帮助!
而且这个控件(比如:自己写的一个控件)可能没有通用的消息(比如你说的WM_COMMAND之类的消息),只有内部的成员函数,此时要如何去控制这个自定义的控件呢??隐约中好象可以使用WM_COPYDATA的消息。但是不明白如何使用
定义消息向CmainFrame的头文件中添加消息的定义语句。
#define WM_SHELLMESSAGE WM_USER+100添加消息处理函数
在CMainFrame的头文件的AFX_MSG块中添加消息处理函数声明:
afx_msg void OnWmShellMessage(WPARAM wParam,LPARAM lParam);消息映射
在CMainFrame类的CPP文件中用ON_MESSAGE宏指令将消息WM_MYSHELLMESSAGE映射到消息处理函数OnWmShellMessage。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_MESSAGE(WM_SHELLMESSAGE,OnWmShellMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
: dzqsuper(丁轲) ( ) 信誉:100 2003-7-8 11:49:56 得分:10
内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。其中利用消息机制实现IPC虽然同其他方法相比有交换的数据量小、携带的信息少等缺点,但由于其实现方便、应用灵活而广泛应用于无须大量、频繁数据交换的内部进程通讯系统之中,尤其是对于在上层主控软件与底层工作软件之间的命令与响应上更能充分显示其良好的性能。本文就通过编制一个主控软件和一个受其操作的底层工作软件来阐述如何用VC++6.0通过消息来实现内部进程通信。
一、Windows消息机制
Windows是一种面向对象的体系结构,Windows环境和应用程序都是通过消息来交互的。Windows应用程序开始执行后,Windows为该程序创建一个"消息队列(message queue)",用以存放邮寄给该程序可能创建的各种不同窗口的消息。消息队列中消息的结构(MSG)为:
typedef struct tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;
其中第一个成员变量是用以标识接收消息的窗口的窗口句柄;第二个参数便是消息标识号,如WM_PAINT;第三个和第四个参数的具体意义同message值有关,均为消息参数。前四个参数是非常重要和经常用到的,至于后两个参数则分别表示邮寄消息的时间和光标位置(屏幕坐标)。把消息传送到应用程序有两种方法:一种是由系统将消息"邮寄(post)"到应用程序的"消息队列"这是"进队消息"Win32 API有对应的函数:
PostMessage(),此函数不等待该消息处理完就返回;而另一种则是由系统在直接调用窗口函数时将消息"发送(send)"给应用程序的窗口函数,属于"不进队消息"对应的函数是SendMessage()其必须等待该消息处理完后方可返回。
二、主控程序的实现
(1)新建一工程文件:Sender,选取MFC AppWizard(exe)。
(2)第二步选取Single document(单文档)。
(3)其余几步均为确省值。
(4)添加三个菜单"命令一"、"命令二"、"命令三"及与之对应的函数:
OnSendComm1()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,0);
}
OnSendComm2()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,1);
}
OnSendComm3()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,1,0);
}
(5)在SenderView.h中添加自定义消息:#define WM_COMM WM_USER+100编译完成即可。
三、底层工作程序的实现
(1)新建工程Receiver、仍是单文档。
(2)在CReceiverApp类的InitInstance()函数末尾添加:
m_pMainWnd->SetWindowText("Receiver");
用以指定底层工作程序的窗口标题,以便主控程序能根据标题获取到此窗口的窗口句柄。
(3)在MainFrm.h中添加自定义消息:#define WM_COMM WM_USER+100。
(4)添加自定义消息WM_COMM的消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_COMM,OnSendMsg)
END_MESSAGE_MAP()
(5)完成消息响应函数OnSendMsg()
void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam)
{
if(wParam==0 && lParam==0)
AfxMessageBox("主控程序发送命令一!");
if(wParam==0 && lParam==1)
AfxMessageBox("主控程序发送命令二!");
if(wParam==1 && lParam==0)
AfxMessageBox("主控程序发送命令三!");
}
我们便可以通过辨别消息的两个消息参数来区分主控程序发送的是哪一个命令从而可以执行相应的操作。执行主控程序和底层工作程序由于本程序采用的是SendMessage()所以当主控程序发送消息给底层工作程序时,底层工作程序弹出响应的模式对话框,在没有关闭对话框前此消息未处理完,SendMessage()也就没有执行完,所以主控程序呈阻塞状态,如改用PoseMessage()则不会发生阻塞,具体选用哪个函数还应根据实际要求灵活掌握。
结论: 通过上面的实例可以看出利用消息进行进程间通信不失为一种便捷的方法,进程间的数据交换量不大却能完成相当的功能,上下层次有着明显的接口,上层和底层只通过这个接口进行通讯,因此只要对上下层程序制定好规范详尽的协议便可编制出协调性很好的软件控制系统。
函数只是C++语言的概念,它不是Windows编程中的元素.所以你得到Handle也只能通过与HANDLE相关的API来控制它.而这个HANDLE和你的函数之间是无关的.(函数属于你包装HANDLE的那个类).