窗口显示的问题

sd666850 2010-12-16 02:27:34
在CWinApp::InitInstance中
{
dlg.Create(ID);
dlg.ShowWindow(SW_SHOWNORMAL);
dlg1.DoModal();
}
创建了两个dialog的对话框
我自己设置了一个定时器,会有一个消息发给这个CWinApp,让它执行一个操作,拉起一个.exe程序,这一切都是没有问题的
遇到的问题是:在我定时器到时间的时候,我的鼠标一直在点击dialog,然后拉起.exe,该.exe是个全屏窗口,但是鼠标的光标还是在dialog上面
再点击一下鼠标的话,.exe的窗口就会自动最小化了,dialog就会显示在最前面

我试了很多方法,我的思路是先用ClipCursor锁定鼠标,这个的作用是不让鼠标点到dialog上面,其实这个可以去掉
关键的步骤是:
拉起.exe
Sleep(1000);
HWND hWnd = FindWindow(NULL,TEXT("test"));
PostMessage( hWnd, WM_SYSCOMMAND,SC_RESTORE, 0L);
SetForegroundWindow(hWnd);
SetWindowPos( hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
SetActiveWindow(hWnd);

就是在这里有问题,有时候还是没等.exe刚拉起,.exe的窗口就自动最小化了,我的理解是焦点还是在dialog上面

后来我试用了下
BOOL (__stdcall *BlockInput)(BOOL Flag);
BlockInput = ( BOOL (__stdcall *)(BOOL ))GetProcAddress(GetModuleHandle( "user32.dll"), "BlockInput");
if (BlockInput)
{
BlockInput(TRUE);
}
就是在启动.exe.之前,调用它,阻止输入设备的输入,效果也不是很好,还是会出现上面的情况

哪位高手有比较好的解决办法,有好的思路也可以,欢迎大家提出宝贵的意见
...全文
235 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
红色代码 2010-12-21
  • 打赏
  • 举报
回复
刚才试了下,除了销毁后面的Dlg,也可以把主窗口的ToolBar也SetWindowPos到顶层,也可以解决问题...
红色代码 2010-12-21
  • 打赏
  • 举报
回复
试了下.确实是有问题.标题栏必须单击后一次后才能响应消息.而ToolBar和其他的则无需单击就可以响应消息.目前想到的解决办法就是把后面的Dlg销毁就好了.就可以不用单击了.其它的都没什么效果.至于为什么没有激活,好像AttachThreadInput得Remarks里讲了些
sd666850 2010-12-20
  • 打赏
  • 举报
回复
PostMessage( hWnd, WM_SYSCOMMAND,SC_RESTORE, 0L);
SetForegroundWindow(hWnd);
SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
SetActiveWindow(hWnd);
这样设置之后,我GetForegroundWindow()为什么得到的不是hWnd呢?
baoyz 2010-12-20
  • 打赏
  • 举报
回复
ClipCursor(&rect); //rect是个矩形区域,就像我上面所说的那样,锁定不锁定,不出什么效果
SetFocus(hWnd);
PostMessage( hWnd, WM_SYSCOMMAND,SC_RESTORE, 0L); //将test233窗口显示在最前面,这样做应该没什么问题吧?

这几句去掉试试。

红色代码 2010-12-20
  • 打赏
  • 举报
回复
感觉和Splash差不多啊.全屏Dlg的时候把这个DLG SetWindowsPos到顶层窗口,SWP_NOSIZE.这样有个问题就是任务栏的其他窗口在这个Dlg被手动最小化之前无法切换...
sd666850 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yjz1409276 的回复:]
感觉和Splash差不多啊.全屏Dlg的时候把这个DLG SetWindowsPos到顶层窗口,SWP_NOSIZE.这样有个问题就是任务栏的其他窗口在这个Dlg被手动最小化之前无法切换...
[/Quote]
切换不切换,我不关心,我现在关心的是SetWindowsPos之后,我SetWindowsPos的窗口为什么没有获得焦点和在显示在前面
sd666850 2010-12-19
  • 打赏
  • 举报
回复
求助,继续求助
sd666850 2010-12-18
  • 打赏
  • 举报
回复
哎。。。我自己再想想吧
向立天 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sd666850 的回复:]
先把.exe窗口隐藏,再把它给show出来,和我们直接让它自己显示,原理上是一样的吧~
你把它show出来的时候,是不是也会碰到同样的问题呢?
至于问题3.不知道你看清楚了没有,我自己做了个模拟,自己建一个窗口,在窗口中点击按钮,拉起.exe,就没有出现焦点被抢占的情况,所以我才怀疑自己是不是方向错误了,这个应该算是个小问题吧,困扰了我好几天了
[/Quote]
你要这么说我还真没看明白你什么意思
也不知道你的程序什么样
光靠猜给不出什么好意见
sd666850 2010-12-18
  • 打赏
  • 举报
回复
先把.exe窗口隐藏,再把它给show出来,和我们直接让它自己显示,原理上是一样的吧~
你把它show出来的时候,是不是也会碰到同样的问题呢?
至于问题3.不知道你看清楚了没有,我自己做了个模拟,自己建一个窗口,在窗口中点击按钮,拉起.exe,就没有出现焦点被抢占的情况,所以我才怀疑自己是不是方向错误了,这个应该算是个小问题吧,困扰了我好几天了
sd666850 2010-12-18
  • 打赏
  • 举报
回复
首先感谢xianglitian朋友的耐心解答,我想了下,按你的方法实现了一下,但是还有点问题,我先隐藏了窗口,再把窗口show,但是这其中还是存在一定的风险,我是按照下面的代码执行的,这样做有什么问题吗?
或者大家有没有什么别的思路什么的,可以提出来,大家探讨一下

WinexeC("test.exe",SW_SHOW); //test233是由test.exe拉起来的,然后test窗口自动销毁
Sleep(500); //等待程序启动
HWND hWnd = FindWindow(NULL,TEXT("test233"));
while (NULL == hWnd)
{
hWnd = FindWindow(NULL,TEXT("test233"));
}
ShowWindow(hWnd,SW_HIDE);
Sleep(1000);
ShowWindow(hWnd,SW_SHOW); //test.exe程序本身就是全屏的,这个用SW_SHOW和SW_MAXIMIZE无所谓的吧?
//ShowWindow(hWnd,SW_MAXIMIZE);

ClipCursor(&rect); //rect是个矩形区域,就像我上面所说的那样,锁定不锁定,不出什么效果
SetFocus(hWnd);
PostMessage( hWnd, WM_SYSCOMMAND,SC_RESTORE, 0L); //将test233窗口显示在最前面,这样做应该没什么问题吧?
SetForegroundWindow(hWnd);
SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
SetActiveWindow(hWnd);
HWND hActive = GetForegroundWindow(); //GetActiveWindow()得到的是空
if ( hWnd != hActive )
{
MessageBox(NULL,TEXT("the dialog of test233 is not topmost"),TEXT("ERROR"),MB_OKCANCEL);--------------->此对话框会弹出,说明前面的执行有点问题
}
向立天 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sd666850 的回复:]
你说得有一定的道理,你觉得现在的问题是这个焦点的问题吗?
但是我单独尝试,就不会出现这样的问题,所以有疑惑是不是自己的方向错了
问题3:如果你不不断地点击主界面第三方程序能正常启动么
能--->所以我在猜想,是不是我的思路错了,问题不是焦点的问题
[/Quote]
我问问题三的目的就是为了确定这个啊
肯定是焦点的问题啊
你不断的点击你的程序
你的程序就有了焦点
第三方程序失去焦点然后就最小化了
你的方向是没错
我是觉得不用去处理
或者是不是可以这样
调用第三方程序的时候将其隐藏
等一段时间之后给他发个最大化消息然后再显示
向立天 2010-12-17
  • 打赏
  • 举报
回复
问题1:你这个exe正常启动然后被其他程序抢到焦点会最小化么
问题2:为什么要在CWinApp里启动第三方程序,直接在OnTimer里不行么
问题3:如果你不不断地点击主界面第三方程序能正常启动么
问题4:你用什么方法实现你所谓拉起的
最后一个问题
你居然直接改写CWinApp而且没有设置主窗口指针
sd666850 2010-12-17
  • 打赏
  • 举报
回复
你说得有一定的道理,你觉得现在的问题是这个焦点的问题吗?
但是我单独尝试,就不会出现这样的问题,所以有疑惑是不是自己的方向错了
问题3:如果你不不断地点击主界面第三方程序能正常启动么
能--->所以我在猜想,是不是我的思路错了,问题不是焦点的问题
向立天 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sd666850 的回复:]
Q:你居然直接改写CWinApp而且没有设置主窗口指针
A:我设置了,只是在代码里面没有贴出来
[/Quote]
其实主要是第一个问题和最后一个问题
如果这个exe正常启动然后被其他程序抢到焦点就会最小化
那你做什么都是徒劳的
除非下全局钩子阻止鼠标消息传递知道这个程序完整显示出来在释放鼠标
否则你不能阻止用户操作
或者说和你自己的程序没有关系
sd666850 2010-12-17
  • 打赏
  • 举报
回复
Q:你居然直接改写CWinApp而且没有设置主窗口指针
A:我设置了,只是在代码里面没有贴出来
sd666850 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
问题1:你这个exe正常启动然后被其他程序抢到焦点会最小化么
问题2:为什么要在CWinApp里启动第三方程序,直接在OnTimer里不行么
问题3:如果你不不断地点击主界面第三方程序能正常启动么
问题4:你用什么方法实现你所谓拉起的
最后一个问题
你居然直接改写CWinApp而且没有设置主窗口指针
[/Quote]
1:会
2:这个在哪里实现无所谓的吧
3:能--->所以我在猜想,是不是我的思路错了,问题不是焦点的问题
4:Winexec,这个和用CreteProcess差不多的吧
红色代码 2010-12-17
  • 打赏
  • 举报
回复
屏蔽鼠标按键消息,定时器时间一到,再恢复
July_Ge 2010-12-16
  • 打赏
  • 举报
回复
期待答案
yiruirui0507 2010-12-16
  • 打赏
  • 举报
回复
定时器一到,先把Dialog最小化,然后起exe
期待高手的好办法。。。。。
加载更多回复(7)

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧