下面是我在VS2008对窗口
1、主窗口最小化到托盘运行
2、当按下自订义的快捷键时,唤出一个登陆窗口置顶显示(DoModal())。正常时登陆窗口应该获得焦点可以输入用户名密码。3、当用户名或密码出错时,主窗口AfxMessageBox("用户名或密码错误!");这时弹出的对话框置顶显示,但无鼠标无法点到确定按钮。需要切换到其它的程序再切回来时才可以。
4、当确认完后重新弹出登陆对话框时,置顶显示,但也无法响应鼠标键盘。也需要切换一次。以上问题是Z轴的顺序造成的还是模式与非模式窗口间的切换造成的?
又或者关闭置顶窗口时要对Z轴顺序处理?已经被这个问题困扰好久 ,求解。望众大神不吝赐教。附上HOTKEY函数// TODO: 在此添加消息处理程序代码和/或调用默认值
    if(nHotKeyId == hotkeyid && b_OnTrayFlag) //20111122 MODIFY BY CQ
    {
        b_OnTrayFlag = 0;//20111122 add by cq
        CLoginDlg loginDlg;
        loginDlg.SetShowType(1);
        while(1)
        {
//            loginDlg.SetForegroundWindow();
//            loginDlg.SetWindowPos(&wndTopMost,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
            if (loginDlg.DoModal() != IDOK)
            { 
                b_OnTrayFlag = 1;//20111122 add by cq
//                loginDlg.SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
                break ;
            }
            CString str_user = loginDlg.str_loginuser;
            CString str_pwd = loginDlg.str_loginpwd;
            pCaptureHandle->ReadLoginUserPass();//读起用户名密码
            if (!pCaptureHandle->str_user.IsEmpty() && !pCaptureHandle->str_pwd.IsEmpty())
            {
                if(str_user == pCaptureHandle->str_user && str_pwd == pCaptureHandle->str_pwd)
                {
                    HICON Icon;
                    Icon = (HICON) AfxGetApp()->LoadIcon(IDR_MAINFRAME);                    ShowWindow(SW_RESTORE);
                    SetForegroundWindow();
                    SetIcon(Icon, FALSE);
                    SetIcon(Icon, TRUE);
                    break;
                }
                else
                {
                    AfxMessageBox("用户名或密码错误!");
                    //loginDlg.ErrorMessage();
                    //errorflag =1;
                }
            }
        }
    }
    CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
}

解决方案 »

  1.   

    那你可以设置,编辑框获取 SetFocus();
      

  2.   

    也试过了。问题是第一次的时候都可以。但在第二次的时候,输入用户名密码错误时,这时AxfMessageBox弹出的消息框就没有焦点了。一定要切一次后台,再切回来再可以点到确认。
    点完确认后继续弹出登陆框,这也是和前面的错误消息框一样,没有焦点。
      

  3.   

    AfxMessageBox("用户名或密码错误!");
    AfxMessageBox如何设定焦点。
      

  4.   

    跟第一次设置相同的方式嘛,比如getDlgItme(控件ID)->setFocus()
      

  5.   

    消息框哪有ID啊。我自己新建了一个消息对话框的类,setfocus后还是一样的结果。我这主要的问题是第一次是没问题,但第二次就会出现这个问题。所以会不会是对话框释放的问题?
      

  6.   

    在对话框的OnInitDialog()加入 CWnd* tt=GetDlgItem(IDC_EDIT_PWD);
    tt->SetFocus();
    但tt的值为NULL。为何?
      

  7.   


    我在HOTKEY函数添加了
    CLoginDlg loginDlg;
    loginDlg.SetShowType(1);
    while(1)
    {
    CWnd* tt=loginDlg.GetDlgItem(IDC_EDIT_PWD);
    tt->SetFocus();
    // loginDlg.SetForegroundWindow();
    // loginDlg.SetWindowPos(&wndTopMost,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);
    if (loginDlg.DoModal() != IDOK)

    得到的结果还是为NULL
      

  8.   

    + loginDlg {CLoginDlg hWnd=0x00000000} CLoginDlg+ this 0x00b2bd10 {CCaptureMHSDlg hWnd=0x00030492} CCaptureMHSDlg * const+ tt 0x00000000 {CWnd hWnd=???} CWnd *
    以上为断点设在tt->SetFocus();时的值。为什么loginDlg hWnd=0x00000000?
    所以tt的值也为0x00000000 吗?
      

  9.   

    你不会是在用Release版本调试吧?
      

  10.   

    是在RELEASE下
    但我设置了
    下面是设置在Release模式下调试的方法:
    1.工程项目上右键 -> 属性
    2.c++ -> 常规 -〉调试信息格式    选  程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi)
    3.c++ -> 优化 -〉优化            选  禁止(/Od)
    4.连接器 -〉调试 -〉生成调试信息 选  是 (/DEBUG)
      

  11.   

    AttachThreadInput(::GetWindowThreadProcessId(::GetForegroundWindow(),NULL), ::GetCurrentThreadId(), TRUE);