下面是我在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、主窗口最小化到托盘运行
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);
}
点完确认后继续弹出登陆框,这也是和前面的错误消息框一样,没有焦点。
AfxMessageBox如何设定焦点。
tt->SetFocus();
但tt的值为NULL。为何?
我在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
以上为断点设在tt->SetFocus();时的值。为什么loginDlg hWnd=0x00000000?
所以tt的值也为0x00000000 吗?
但我设置了
下面是设置在Release模式下调试的方法:
1.工程项目上右键 -> 属性
2.c++ -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意:如果是库的话,只能(Zi)
3.c++ -> 优化 -〉优化 选 禁止(/Od)
4.连接器 -〉调试 -〉生成调试信息 选 是 (/DEBUG)