阅读:1517回复:17
VXD用SHELL_PostMessage,app怎么办呢?
在VXD中断处理程序中用SHELl_PostMessage向app发送一个自定义消息,那么app的相关处理程序应该如何编写呢?
请高手指点: SHELL_PostMessage(hWnd,WM_My_MESSAGE,0,0,NULL,NULL); |
|
|
沙发#
发布于:2002-08-13 13:22
app是mfc的?
|
|
板凳#
发布于:2002-08-13 13:27
app是mfc的? 是的 |
|
|
地板#
发布于:2002-08-13 13:43
可以在mainframe的BEGIN_MESSAGE_MAP的下面,加消息。
下面是WM_CREATE的例子。 比如,先 #define ON_WM_MY_MSG() \\ { WM_My_MESSAGE, 0, 0, 0, AfxSig_is, \\ (AFX_PMSG)(AFX_PMSGW)(int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))&MyMessage }, 把他加到BEGIN_MESSAGE_MAP。别忘了在h文件还要声明。 afx_msg void MyMessgae(); 实际也就是加个消息响应函数。 |
|
地下室#
发布于:2002-08-13 13:52
可以在mainframe的BEGIN_MESSAGE_MAP的下面,加消息。 是这样加么? BEGIN_MESSAGE_MAP(CSC200TESTDlg, CDialog) //{{AFX_MSG_MAP(CSC200TESTDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() #define ON_WM_MY_MSG() \\ { WM_My_MESSAGE, 0, 0, 0, AfxSig_is, \\ (AFX_PMSG)(AFX_PMSGW)(int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))&OnSC200Message } //}}AFX_MSG_MAP END_MESSAGE_MAP() |
|
|
5楼#
发布于:2002-08-13 14:11
不行啊,请详细一些吧,谢谢了.
|
|
|
6楼#
发布于:2002-08-13 15:45
ft
在前面用#define... ,然后再加ON_MY_MESSAGE |
|
7楼#
发布于:2002-08-14 09:48
ft 请详细一些吧,我会给你分的、 |
|
|
8楼#
发布于:2002-08-14 09:54
实际呢,我也没有这样亲自做过的,没有自己的消息呀。 :D
理论上。 先 #define ON_WM_MY_MSG() \\ { WM_My_MESSAGE, 0, 0, 0, AfxSig_is, \\ (AFX_PMSG)(AFX_PMSGW)(int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))&OnMyMsg }, 然后在message map,加个 ON_WM_MY_MSG() 在h文件,加 afx_msg void OnMyMsg(); //声明 在cpp文件,加 void CMainFrame::OnMyMsg() { //it\'s my message } 成功了告诉我。 :D |
|
9楼#
发布于:2002-08-14 09:58
好的,谢谢,我马上试试
|
|
|
10楼#
发布于:2002-08-14 10:03
出错:
WM_MY_MESSAGE没有定义 |
|
|
11楼#
发布于:2002-08-14 10:09
当然要先定义呀。
比如 #define WM_MY_MESSAGE WM_USER + 100 VxD也要有这个东东。 |
|
12楼#
发布于:2002-08-14 10:17
编译成功了,可我还是有点疑问,为什么你写的那个
#define ON_WM_MY_MSG() \\ { WM_My_MESSAGE, 0, 0, 0, AfxSig_is, \\ (AFX_PMSG)(AFX_PMSGW)(int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))&OnMyMsg }, 是用{}呢?还有末尾有个逗号,我去掉逗号就会出错? |
|
|
13楼#
发布于:2002-08-14 10:26
呵呵,你去看看那个BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏是怎么定义的。
|
|
14楼#
发布于:2002-08-14 10:50
编译都通过了,可运行还是没有执行我的cpp中断服务程序。
我想会不会是我的deviceiocontrol传递窗口句柄有问题。 在cpp中: CWnd* Main_CWnd; Main_CWnd=AfxGetMainWnd(); PVOID inBuf; inBuf=Main_CWnd->m_hWnd; DeviceIoControl(hDevice,W32IF_PASS_EVENT,inBuf,sizeof(PVOID),NULL,0,NULL,NULL); 在VXD中 先定义了: DWORD* PostMsghWnd; //Ring3层应用程序的hWnd HANDLE hWnd; 然后: case W32IF_PASS_EVENT: PostMsghWnd=(DWORD*)pDIOCParams->dioc_InBuf; hWnd=(HANDLE)*PostMsghWnd; //获得主窗口句柄 status=0; break; |
|
|
15楼#
发布于:2002-08-14 11:11
HWND inBuf;
inBuf=Main_CWnd->GetSafeHWnd(); HANDLE hWnd; hWnd=(HANDLE)pDIOCParams->dioc_InBuf; 用不着再转来转去了吧。 |
|
16楼#
发布于:2002-08-14 11:34
这样不行的,inbuf必须是传递地址好像。
|
|
|
17楼#
发布于:2002-08-14 11:37
实际呢,我也没有这样亲自做过的,没有自己的消息呀。 :D 我已经给你分了,谢谢你的帮助。 |
|
|