窗口程序在失去焦点后未响应

wubicheng 2013-08-11 08:23:33
我有一个程序,在VS下运行没有一点问题,但是如果独立运行,不管是Debug版还是Release版,在启动界面以及开始菜单界面都不能让程序失去焦点,否则程序就会未响应,哪怕是一失去焦点就马上让程序获得焦点也不行,程序虽然不会未响应,但是却会变得极不稳定,程序必须要等进入主界面后才能够正常起来。不知道这是为什么?
主要现象就是:
启动程序后,在菜单界面下让程序失去焦点,大约1~2秒后程序就会未响应。
启动程序后,在菜单界面下让程序失去焦点,程序不会未响应,但是会变得极不稳定,比如有时窗口会像发地震一样抖动,但是我的程序里除了在创建完窗口后调用了一次MoveWindow,并没有在其他地方添加任何移动窗口的代码,再比如有时窗口的客户区会莫名其妙就透明了,但是窗体不透明,仅仅客户区那一块透明,搞得就好像在窗口上挖了个洞似的,以前想实现这样的功能都实现不了,现在到好了,不要这个功能的时候它却自动跑来了。再比如有时窗口会出现闪白现象,但是我是使用双缓冲来显示的,照理来说应该不会出现这种情况才对。当窗口不稳定的时候才会发生上述的现象。

而如果我在菜单界面保持焦点不丢失,进入到主界面后程序就正常了,我检查过我程序那前一部分的代码,感觉应该是没有什么问题才对,而且如果代码真有问题,为何在VS下运行时一点问题都没有。

求大神指点迷津。
...全文
969 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不转弯 2015-07-24
  • 打赏
  • 举报
回复 1
请问楼主最后是怎么解决的啊?
wubicheng 2013-08-13
  • 打赏
  • 举报
回复
好吧,我自己找出了原因所在,但是目前没有找到解决方法,根本原因在于32位与64位的不兼容,我是用Win32 API写的程序,在Win7下跑可能会由于64位与32位的问题而引起程序不稳定,切换到经典模式,或者是XP系统就一点问题都没有了,我也知道为什么在编译器下下运行没有问题了,编译器下运行时,编译器会给程序营造一个32位的环境,所以跑起来就没有问题。 但是具体该如何解决这个问题呢?
wubicheng 2013-08-13
  • 打赏
  • 举报
回复
depends.exe我没有,VS调试时的这个输出窗口中的有没有参考价值?
这是Win32平台下编译的:

这是X64平台下编译的:


但是两个编译出来的程序都是在VS下运行没有问题,一独立运行就出毛病,即使是X64平台下编译的也不行。是不是除了要换编译环境还要修改代码啊?如果是这样的话那要怎么改啊?好像Win7下API用的还是Win32 API啊,应该没有发生变化的才对,在MSDN上查,他也只是说指针发生了变化而基本数据类型没有变化,函数的话压根就没有分什么32位的函数和64位的函数。
继续求大神解答!
赵4老师 2013-08-13
  • 打赏
  • 举报
回复
在64位Windows下: 64位dll在目录c:\windows\system32目录下; 32位dll在目录c:\windows\syswow64目录下; 用depends.exe查看exe依赖的dll
赵4老师 2013-08-12
  • 打赏
  • 举报
回复
SetForegroundWindow The SetForegroundWindow function puts the thread that created the specified window into the foreground and activates the window. Keyboard input is directed to the window, and various visual cues are changed for the user. The system assigns a slightly higher priority to the thread that created the foreground window than it does to other threads. BOOL SetForegroundWindow( HWND hWnd // handle to window to bring to foreground ); Parameters hWnd Handle to the window that should be activated and brought to the foreground. Return Values If the window was brought to the foreground, the return value is nonzero. If the window was not brought to the foreground, the return value is zero. Remarks The foreground window is the window at the top of the Z order. It is the window that the user is working with. In a preemptive multitasking environment, you should generally let the user control which window is the foreground window. Windows NT 5.0 and later: An application cannot force a window to the foreground while the user is working with another window. Instead, SetForegroundWindow will activate the window (see SetActiveWindow) and call theFlashWindowEx function to notify the user. Windows CE: The thread that owns the window is not given a priority boost. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winuser.h. Import Library: Use user32.lib. See Also Windows Overview, Window Functions,FlashWindowEx, GetForegroundWindow, SetActiveWindow
wubicheng 2013-08-12
  • 打赏
  • 举报
回复
啊,快崩溃了,又出现了新问题,画面莫名其妙除了背景图外什么都没有了,而且又是只在独立运行时出现问题,在VS下运行始终调试不出问题来,一独立运行就出错,想问问各位大神,这到底是怎么回事?有可能是哪些原因引起的,我以前也写过Windows程序,但是从没有出现过这种情况。
引用 6 楼 zhao4zhong1 的回复:
SetForegroundWindow The SetForegroundWindow function puts the thread that created the specified window into the ......
你这个函数我知道,但是这只是去避免它失去焦点,不能从源头解决问题,而且如果我使用这种方法的话,即使能够使程序始终保持焦点不丢失,但是与此同时,用户在运行程序时也不能再干其他事了,相当于独占了整个操作系统,这肯定是不行的。不知道赵老师能不能够提出更好地解决办法。目前我采用的方法是程序运行起来就隐藏鼠标,并限制鼠标移动范围在客户区内,但这种方法同样不完善,用户可以通过键盘切换出去,结果还是程序画面卡死,出现老问题,而如果我连键盘切换也禁止的话,那就成了我刚刚说的独占,还是不行。我希望我的程序是能够在运行时用户还能进行其他操作的。 继续求大神指点迷津!
wubicheng 2013-08-11
  • 打赏
  • 举报
回复
不是这样的,焦点获取只有在不稳定时才时断时续,而不稳定的前提是我在失去焦点后立即有获取到焦点,比如现在我有一个文件夹打开着,一个程序打开着,原本焦点在程序那儿,然后我直接关闭文件夹,焦点会暂时落到文件夹上面,待文件夹关闭后,焦点又会回到程序上来,但是此时程序就会变得不稳定,只有不稳定的时候,程序的焦点才时断时续。 我现在的问题是,我主动放弃焦点,将焦点转向其他窗口,比如桌面,程序在没有获得焦点一段时间后,画面就停止不动了,此时点击程序的窗口,使程序重新获得焦点,程序标题栏就会显示未响应。 这里需要注意的是: 1、焦点如果不主动放弃,会一直停留在程序上。 2、程序是在焦点丢失一段时间之后画面才会停止不动,不是一失去焦点画面就不动了,虽然这个一段时间其实也就几秒,但确实是等了那么一会儿。 3、程序只有在已获得焦点的情况下又失去焦点才会出现这种情况,如果程序一开始就未获得过焦点,或程序没有失去过焦点,程序是可以正常运行的。 4、刚刚我又有新的发现,当程序未响应后,如果我打开“我的电脑”,然后 工具 -> 文件夹选项 -> 查看 -> 高级设置,更改高级设置里的任意一项,然后应用,Window好像会把所有窗口都更新一次,然后我发现我的程序奇迹般又恢复了正常,但是一旦它获得焦点后再失去焦点,又会未响应。 根据上面第4点,我推测我的程序实际上并没有未响应,只是画面卡死了而已,各位大神,这有没有可能是程序在未获得焦点一段时间后,Window就会使程序进入未激活状态,而未激活状态下,主消息循环就被堵塞了,所以我的程序看起来就好像未响应了,这只是我的猜测,我也不知道Window在我的程序失去焦点后对我的程序做了什么。
忘世麒麟 2013-08-11
  • 打赏
  • 举报
回复
我觉得是逻辑上有问题。用纸把你的整体思路缕一遍看一下。 然后假如通过vs启动没问题而之间点击exe文件启动出现问题的话,我想是不是因为vs运行过程中程序一直拥有焦点而且目前cpu的优先级最高的主任务就是你的程序,而点击可执行文件启动发生问题,我想可能是因为cpu仅仅使用了一个优先级比较低的线程处理你的任务,而且cpu忙着在电脑不同线程之间切换使得你的程序获得的焦点时断时续的,所以发生问题。 以上是我的一孔之见。
wubicheng 2013-08-11
  • 打赏
  • 举报
回复
帖子又掉下去了,我也是在坐等大神啊,赵老师是其中一位。目前没有点头绪,这个问题出现的非常奇葩,从没遇到过这样的疑难杂症,我身边的人也问了不少,他们也想不出个所以然。
忘世麒麟 2013-08-11
  • 打赏
  • 举报
回复
坐等赵老师。
wubicheng 2013-08-11
  • 打赏
  • 举报
回复
这个问题有点麻烦,主要是在VS下运行没有问题,只在独立运行的时候才会出错,这样就没办法进行调试,出错了也不知道是错在了哪个地方。求各位大神帮个忙吧,不知道的也给帮忙顶顶吧,这个程序做了3个月了,即将完成之际出现这种情况实在是让人郁闷。 经过下午的不断测试,感觉又好像不是激活的问题,因为我尝试着在WM_ACTIVATE中当wParam=WA_INACTIVE时向窗口发送一个wParam为WA_ACTIVE的WM_ACTIVATE消息,也尝试过在里面调用SetFocus,还尝试过UpdateWindow,但是都没有效果。目前还没有想到新的办法。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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