这个程序是用传统的windows编程方法编写的.
在程序运行过程过, 我调用 API 函数 DialogBox 创建了一个对话框, 这个对话框拥有
一个菜单, 我怎么给这个菜单添加 加速键 呢? 
在 WinMain 函数内改写消息循环.
while ( GetMessage ( &msg,NULL,0,0 ) )
{
if( !TranslateAccelerator(对话框的窗口句柄, hAccel, &msg) )//在这里遇到了麻烦,对话框的窗口句柄还没有创建,那该怎么给这个对话框的菜单加载 加速键呢
    {
TranslateMessage (&msg);
DispatchMessage (&msg) ;
}
}
100分给提供正确解决方案者.不用MFC

解决方案 »

  1.   

    在DialogProc中用GetParent 保存句柄
      

  2.   

    不对呀,你可以在DialogProc中这样调用一个函数的:
    if (  WM_KEYDOWN ==  pMsg->message
        &&s_nIDVK  ==  pMsg->wParam  // <= static int s_nIDVK;
    //  &&GetKeyState(VK_SHIFT) < 0
       )
    {
       DWORD dwStyle = (DWORD)GetWindowLong(m_hWnd, GWL_STYLE);
       if (dwStyle & WS_POPUP)
       {
          ...      return true
       }
    }
      

  3.   

    谢谢 光荣 兄:对于你提供的方法,小弟有几个地方不懂.请你解释一下好吗?
    然后结贴.1. s_nIDVK是什么东西呢.msdn上没有查到. (菜鸟就这样,没什么奇怪的)
    2. GetKeyState(VK_SHIFT) < 0   为什么判断这个东西呢? 高字位是'1',这个数就小于零吗? 
    3. 为什么还要判 断是否是 WS_POPUP ,对话框当然有弹出风格啊?是不是多余了?
      

  4.   

    光荣兄的方法并不是在所有操作系统环境下通用,并且一旦对话框失去焦点,将不能按照光荣兄的办法拦截键盘输入消息。使用::GetKeyState的前提是你的DialogProc可以被调用。
    我提供三种方法,仅供参考:
    1. 在Win2000以下的操作系统,可以采用注册热键的方法,即调用::RegisterHotKey,注册热键,然后响应WM_HOTKEY消息,其中lParam参数判断按下的功能键,再调用::GetKeyState判断按下的按键虚拟键码。这种方法不能拦截类似ESC+CTRL的组合。
    2. 在win2000或以上,采用键盘钩子进行拦截,用::SetWindowsHookEx注册钩子函数,回调函数::LowLevelMouseProc即实际拦截按键消息的钩子函数,拦截的消息为WH_KEYBOARD_LL。具体参数含义参考MSDN。
    3. 但是第二种方法不能拦截CTRL+DEL+ALT,如果想要拦截,需要替换MSGINA.DLL中的WlxLoggedOnSAS函数,具体内容参考MSDN中的Winlogon and GINA Reference,不过初学者最好不要轻易使用。