描述:
我的客户端是不能修改的,最好在控件中作协修改。
解决方案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
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