• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > ActiveX中创建的非模态对话框显示后,不能相应键盘操作?怎么解决?

ActiveX中创建的非模态对话框显示后,不能相应键盘操作?怎么解决?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了非模态对话框,非模态对话框创建,mfc非模态对话框,模态和非模态对话框,mfc创建非模态对话框等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: ActiveX中创建的非模态对话框显示后,不能相应键盘操作?怎么解决?
描述:

我的客户端是不能修改的,最好在控件中作协修改。


解决方案1:

1.in your init function.call this
MSG msg;
while (::IsWindowVisible(g_hOEMainWnd))
{
if(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
// Send all keyboard messages to the window of your
// application.  hwndApp is the window handle of
// your application.
//
// if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST && msg.message == WM_KEYDOWN)
// ::SendMessage(this->m_hWnd,msg.message, msg.wParam, msg.lParam);
DispatchMessage(&msg);
}
}
2.in your dialog function deal OnKeydown function
LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled)
{
// m_spWebBrowser is a data member of type IWebBrowser2.
// Using CComQIPtr in this way queries m_spWebBrowser
// for the IOleInPlaceActiveObject interface which is
// then stored in the pIOIPAO variable.
//
CComQIPtr<IOleInPlaceActiveObject,
&IID_IOleInPlaceActiveObject> pIOIPAO(m_spWebBrowser);
HRESULT hr = S_FALSE;
if (pIOIPAO)
{
MSG msg;
msg.message = uMsg;
msg.wParam = wParam;
msg.lParam = lParam;
hr = pIOIPAO->TranslateAccelerator(&msg);
}
return hr;
}
for more details ,msdn have an article talking about this

解决方案2:

1.2.1.13 组件/DLL中创建非模态对话框不能处理某些键
问:我的COM组件中有几个非模态对话框,使用客户程序调用这些非模态对话框,但却发现它们不能响应键盘操作,比如按回车或tab键都不起作用,郁闷死了,这些键盘操作对我来说挺重要。有哪位高手能给予指点迷津,先谢谢啦!
答:要让非模态对话框处理对话框特定消息,消息循环需要调用IsDialogMessage API。但是动态库和COM组件无法修改当前的从消息循环来做到这一点。你可以在对话框生命期中用一个WH_MESSAGE钩子来捕获并且处理这些消息
BOOL CALLBACK DllDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
   switch ( uMsg )
   {
     case WM_INITDIALOG:
         hHook = SetWindowsHookEx( WH_GETMESSAGE, GetMsgProc,
                                   NULL, GetCurrentThreadId() );
         return TRUE;
     case WM_COMMAND:
         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
         {
       
     DestroyWindow( hwndDlg );
            hwndDllDlg = NULL;
         }
         return TRUE;
     case WM_DESTROY:
         UnhookWindowsHookEx( hHook );
         return FALSE;
   }
   return FALSE;
}
LRESULT FAR PASCAL GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   LPMSG lpMsg = (LPMSG) lParam;
   if ( nCode >= 0 && PM_REMOVE == wParam )
   {
      // Don't translate non-input events.
      if ( (lpMsg->message >= WM_KEYFIRST && lpMsg->message <= WM_KEYLAST) )
      {
         if ( IsDialogMessage(hwndDllDlg, lpMsg) )
         {
            // The value returned from this hookproc is ignored, 
            // and it cannot be used to tell Windows the message has been handled.
            // To avoid further processing, convert the message to WM_NULL 
            // before returning.
            lpMsg->message = WM_NULL;
            lpMsg->lParam  = 0;
            lpMsg->wParam  = 0;
         }
      }
   }
   return CallNextHookEx(hHook, nCode, wParam, lParam);
} 
参考文档
微软知识库文章Q233263 PRB: Modeless Dialog Box in a DLL Does Not Process TAB Key


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 请问在非MFC程序中怎么调用系统控件?
  • 100分求助MFC编写的DLL非模态窗体中中使用ACTIVEX无法释放问题!!
  • Excel插件弹出的无模态对话框,Edit控件不能输入?
  • A组件的界面如何做为模态对话框在B组件的界面里的弹出?
  • Excel插件弹出的无模态对话框,Edit控件不能输入?
  • 使用atl开发ActiveX控件,如何弹出模态对话框
  • 带OCX的非模态对话框的初始化求助
  • 关于atlactivex的模态对话框的一个奇怪问题
  • 非模态对话框设为child风格图像会乱,怎么办?
  • vs2005dll非模态对话框Tab切换回车键响应

相关文章

  • 2017-06-05 我想创建一个可以规定线程数量的线程池,请问我该怎么做???
  • 2017-06-05 文件过滤驱动的开发
  • 2017-06-04 各位英雄注意啦,有一个小问题急需解决!大家来帮帮忙!
  • 2017-06-04 vs2005串口通信控件MSCOMM
  • 2017-06-05 VC++2008写ocx(activex),localhost调试无误,外部访问则“(ocx名)对象不支持此属性或方法”
  • 2017-06-04 请教高人:关于ATL控件的注册和toolbar更新
  • 2017-06-05 怎样让线程CreateThread结束时发一个提示消息?
  • 2017-06-05 用VC写DLL中可否对数据库进行操作,应怎样操作。
  • 2017-06-04 如何使用BHO(browserhelperobjects)实现将打开的网页中的电话号码找出来,显亮显示的功能!急
  • 2017-06-05 请问哪里有介绍创建DLL的资料下载?我从来没有写过DLL,请问应该从哪里下手好?谢谢!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 求助:win32当中如何用代码调用ocx控件
    • 关于隐藏进程的问题__过年大送分<2>
    • acitveX调用对话框的create函数报错,请大家帮忙,谢谢!
    • 在MFC工程添加一个ATLsimpleobject的COM接口继承我自己写的一个tlb中的接口。
    • 请问各位大侠:在复合文件中怎样设置,才能使流的内容从流的开头写起
    • 初学者问:在Win2000pro中做的程序,在另一台机子的98中文什么通不过啊!!
    • 关于运行期动态调整网页控件大小的问题
    • 怎样将一个控件从当前工程中移除?
    • 怎么注册关于水晶报表的Active控件啊?
    • svchostexe内存占用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有