求助,别人调用dll打开我的非模态对话框,为什么PreTranslateMessage获取不到消息了

aliwawaww 2014-05-23 09:51:02
真心求助,消息这里还不是多懂。看了很多还是很迷糊。我知道hook能解决部分问题,但公司不让用hook。dll是我这边封装的界面dll,打开方式是非模态的
...全文
342 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
aliwawaww 2014-09-10
  • 打赏
  • 举报
回复
当然这样会出现个别小问题。对话框的模式不再是child 改回popup,这样打开对话框也许会出现刷新不全的问题可以用定时器刷新一下完美解决。这种方法跨语言没问题。
aliwawaww 2014-09-10
  • 打赏
  • 举报
回复
问题解决了 但是楼上没一个人的问题满意的 现在说出解决思路。思路很简单 开启一个线程模态打开对话框。然后再按非模态的处理方式再设置父窗口和放置位置。
向立天 2014-06-26
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
Eleven 2014-05-26
  • 打赏
  • 举报
回复
引用 17 楼 u014784307 的回复:
[quote=引用 14 楼 xianglitian 的回复:] [quote=引用 9 楼 u014784307 的回复:] [quote=引用 7 楼 xianglitian 的回复:] 换成在WndProc里截取试试
怎么截取啊,新手不懂。根hook原理一样吗[/quote]跟PreTranslateMessage的原理一样 有些时候消息不走PreTranslateMessage 但是理论上只要有消息就要走WndProc[/quote] 版主,MFC里是不是该调用windowproc?是在子对话框里调用还是主对话框调用?还有子对话框的消息是不是被主对话框拦截了?我这边负责主对话框的人总是说他那边没拦截。我该怎么回答。。新手勿怪问题多啊[/quote] SetWindowLong(.., GWL_WNDPROC, ...);
aliwawaww 2014-05-26
  • 打赏
  • 举报
回复
引用 14 楼 xianglitian 的回复:
[quote=引用 9 楼 u014784307 的回复:] [quote=引用 7 楼 xianglitian 的回复:] 换成在WndProc里截取试试
怎么截取啊,新手不懂。根hook原理一样吗[/quote]跟PreTranslateMessage的原理一样 有些时候消息不走PreTranslateMessage 但是理论上只要有消息就要走WndProc[/quote] 版主,MFC里是不是该调用windowproc?是在子对话框里调用还是主对话框调用?还有子对话框的消息是不是被主对话框拦截了?我这边负责主对话框的人总是说他那边没拦截。我该怎么回答。。新手勿怪问题多啊
向立天 2014-05-24
  • 打赏
  • 举报
回复
引用 9 楼 u014784307 的回复:
[quote=引用 7 楼 xianglitian 的回复:] 换成在WndProc里截取试试
怎么截取啊,新手不懂。根hook原理一样吗[/quote]跟PreTranslateMessage的原理一样 有些时候消息不走PreTranslateMessage 但是理论上只要有消息就要走WndProc
无言猪 2014-05-24
  • 打赏
  • 举报
回复
PreTranslateMessage是MFC自己特有的处理,为了MFC的一些特性,比如tooltip。如果message loop的处理不是MFC框架做的,自然就不会调用PreTranslateMessage,而直接调用该消息对应的消息处理函数。MFC中的很多函数都是对应的标准windows消息,但是PreTranslateMessage不是。
schlafenhamster 2014-05-24
  • 打赏
  • 举报
回复
"理论上只要有消息就要走WndProc" +1
aliwawaww 2014-05-23
  • 打赏
  • 举报
回复
引用 11 楼 zzz3265 的回复:
MFC的机制决定 PreTranslateMessage 无法是无法跨模块自动调用的, 你可以在DLL导出一个函数, 由上面exe调用进入 PreTranslateMessage 我也遇到过这种问题, 就是这么干的
你的解决方法是不是跟这个网页里说的方法一样?http://bbs.csdn.net/topics/80222883 那楼主的最下面说了解决方法就是导出接口
aliwawaww 2014-05-23
  • 打赏
  • 举报
回复
引用 11 楼 zzz3265 的回复:
MFC的机制决定 PreTranslateMessage 无法是无法跨模块自动调用的, 你可以在DLL导出一个函数, 由上面exe调用进入 PreTranslateMessage 我也遇到过这种问题, 就是这么干的
老兄,我用接口导出函数也试了。单纯c++也走通了。但是我们这更棘手点。跨语言,我这边呢是子模块,调用我的主模块是delphi写的那该怎么办啊
Yofoo 2014-05-23
  • 打赏
  • 举报
回复
MFC的机制决定 PreTranslateMessage 无法是无法跨模块自动调用的, 你可以在DLL导出一个函数, 由上面exe调用进入 PreTranslateMessage 我也遇到过这种问题, 就是这么干的
schlafenhamster 2014-05-23
  • 打赏
  • 举报
回复
Section B: Characteristics of a Modeless Dialog Box A modeless dialog box does not disable its owner window. Therefore, the user can continue to work with the owner window while the modeless dialog box is displayed. A modeless dialog receives its messages through the application's main message loop. An application typically calls the IsDialogMessage() function to process keyboard input for the modeless dialog box. IsDialogMessage() handles changing the focus between controls using the keyboard.
aliwawaww 2014-05-23
  • 打赏
  • 举报
回复
引用 7 楼 xianglitian 的回复:
换成在WndProc里截取试试
怎么截取啊,新手不懂。根hook原理一样吗
aliwawaww 2014-05-23
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
isdialogmessage 编辑词条 目 录 1定义 2例子 1 定义 函数功能:该函数决定一个消息是否指定给指定的对话框,如果是,则处理消息。 函数原型:BOOL IsDialogMessage(HWND hDlg,LPMSG IpMsg);   参数:  hDlg:标识对话框。  IpMsg:指向一个含有将被检测的消息的MSG结构。   返回值:如果消息被处理,则返回值为非零值;如果消息没有被处理,则返回值为零。   备注:尽管IsDialogMessage函数是为无模态对话框而扩展的,但可以用含有控制的任何一个窗口来使用它。当 IsDialogMessage处理一个消息时,它检测键盘信息并把它们转变成对响应对话框的选择命令。例如当按下tab时选择下一个控制或控制组,当按下down时选择控制组的下一个控制。因为IsDialogMessage 函数要执行消息所有必要的转变和传送,IsDialogMessage函数处理的消息不必传送给TranslateMessage或 DispatchMessage函数处理。 IsDialogMessage函数把WM_GETDLGETDLGCODE发送到对话框应用程序,决定应该处理哪个键。 lsDialogMessage函数把DM_GETDEFID和DM_SETDEFID消息发送到窗口。这些消息在WINUSERH头文件中定义为WM_USER和WM_USER+1所以就有与应用程序定义的有一样值的消息发生冲突。 速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本; 头文件:winuser.h; 库文件:usgr32.lib:Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
额 新手。我也关注过这个函数,但该怎么用呢,有没有直观的代码呢
向立天 2014-05-23
  • 打赏
  • 举报
回复
换成在WndProc里截取试试
wyx100 2014-05-23
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
isdialogmessage 编辑词条 目 录 1定义 2例子 1 定义 函数功能:该函数决定一个消息是否指定给指定的对话框,如果是,则处理消息。 函数原型:BOOL IsDialogMessage(HWND hDlg,LPMSG IpMsg);   参数:  hDlg:标识对话框。  IpMsg:指向一个含有将被检测的消息的MSG结构。   返回值:如果消息被处理,则返回值为非零值;如果消息没有被处理,则返回值为零。   备注:尽管IsDialogMessage函数是为无模态对话框而扩展的,但可以用含有控制的任何一个窗口来使用它。当 IsDialogMessage处理一个消息时,它检测键盘信息并把它们转变成对响应对话框的选择命令。例如当按下tab时选择下一个控制或控制组,当按下down时选择控制组的下一个控制。因为IsDialogMessage 函数要执行消息所有必要的转变和传送,IsDialogMessage函数处理的消息不必传送给TranslateMessage或 DispatchMessage函数处理。 IsDialogMessage函数把WM_GETDLGETDLGCODE发送到对话框应用程序,决定应该处理哪个键。 lsDialogMessage函数把DM_GETDEFID和DM_SETDEFID消息发送到窗口。这些消息在WINUSERH头文件中定义为WM_USER和WM_USER+1所以就有与应用程序定义的有一样值的消息发生冲突。 速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本; 头文件:winuser.h; 库文件:usgr32.lib:Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
schlafenhamster 2014-05-23
  • 打赏
  • 举报
回复
isdialogmessage 编辑词条 目 录 1定义 2例子 1 定义 函数功能:该函数决定一个消息是否指定给指定的对话框,如果是,则处理消息。 函数原型:BOOL IsDialogMessage(HWND hDlg,LPMSG IpMsg);   参数:  hDlg:标识对话框。  IpMsg:指向一个含有将被检测的消息的MSG结构。   返回值:如果消息被处理,则返回值为非零值;如果消息没有被处理,则返回值为零。   备注:尽管IsDialogMessage函数是为无模态对话框而扩展的,但可以用含有控制的任何一个窗口来使用它。当 IsDialogMessage处理一个消息时,它检测键盘信息并把它们转变成对响应对话框的选择命令。例如当按下tab时选择下一个控制或控制组,当按下down时选择控制组的下一个控制。因为IsDialogMessage 函数要执行消息所有必要的转变和传送,IsDialogMessage函数处理的消息不必传送给TranslateMessage或 DispatchMessage函数处理。 IsDialogMessage函数把WM_GETDLGETDLGCODE发送到对话框应用程序,决定应该处理哪个键。 lsDialogMessage函数把DM_GETDEFID和DM_SETDEFID消息发送到窗口。这些消息在WINUSERH头文件中定义为WM_USER和WM_USER+1所以就有与应用程序定义的有一样值的消息发生冲突。 速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本; 头文件:winuser.h; 库文件:usgr32.lib:Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
aliwawaww 2014-05-23
  • 打赏
  • 举报
回复
引用 3 楼 xihu1364 的回复:
是导出接口? 这样的话调用者怎么能得到dll中的PreTranslateMessage消息? 我没理解错吧?
估计理解错了吧- - 是这样的,我这边导出个接口,别人调用接口就回打开我封装的界面,界面里有各种界面控件操作,其中界面里有几个消息操作需要在PreTranslateMessage里实现。我模态打开的时候调试时进去这个函数的,也能截获到消息 如:鼠标左键按下,双击等。我会根据这些消息做些控件变化,如图片切换,或者全屏。 但问题出现了,现在必须换成非模态打开,然后调试发现PreTranslateMessage根本不进去了,也就截获不了消息。用hook的话可以截获消息然后传送给PreTranslateMessage。但公司部让用hook。现在我想知道还有其他方法解决PreTranslateMessage进步了的问题么
版主大哥 2014-05-23
  • 打赏
  • 举报
回复
是导出接口? 这样的话调用者怎么能得到dll中的PreTranslateMessage消息? 我没理解错吧?
aliwawaww 2014-05-23
  • 打赏
  • 举报
回复
引用 1 楼 xihu1364 的回复:
dll是导出类吧?不是导出方法吧? 导出类的话,继承一下dll中的导出类,在派生类中重写PreTranslateMessage不就有消息了?
额 不是导出类。我是做平台的嘛。dll封装了个界面,别人调用我这边一个函数来打开界面,我函数里面打开方式是非模态的。因为要嵌入到他那边的一个界面里做子对话框
加载更多回复(1)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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