如何解决按住系统按钮导致消息阻塞?

futurecs 2012-06-29 12:22:36
最近在做一个远程传输的项目,发现一个问题,程序中的任何一个窗口按住 最小化或者最大化、关闭按钮不放,会导致整个程序所有消息阻塞,线程中的数据传输也会停止,不知该如何解决?需要自己处理什么系统消息吗?

最简单的测试, 新建一个窗体,放一个Timer控件,按住最小化的时候 Timer里的代码就不运行了。

放一个CppWebBrowser控件,打开一个视频网页播放,按住最小化按钮的时候播放就停止了,而IE就没有这个问题。

CB2010,请问该如何解决。
...全文
275 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
futurecs 2012-07-03
  • 打赏
  • 举报
回复
自己解决了,给需要绘制的窗体发自定义消息,然后处理自定义的消息中绘图就可以了。
futurecs 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
考虑窗口处理为无标题栏的,并自己绘制标题栏,最大化,最小化以及关闭按钮,这样应该不会阻塞窗口的绘图事件……
[/Quote]

这是一种办法,但是代价有些大了,有没有什么办法在 WM_NCLBUTTONDOWN 或者 WM_CAPTURECHANGED
消息上做些手脚来实现呢。
「已注销」 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
...
另外一个问题谁能解决呢? 如何像IE或者WIN自带的远程协助/远程桌面 那样,按住系统按钮也不会阻塞该窗口的绘图事件。
[/Quote]
考虑窗口处理为无标题栏的,并自己绘制标题栏,最大化,最小化以及关闭按钮,这样应该不会阻塞窗口的绘图事件……
futurecs 2012-06-30
  • 打赏
  • 举报
回复
问题找到了,UDP的线程中 有一些向窗体输出记录的代码,涉及到VCL的东西可能自动同步调用了,所以按住主窗口上的系统按钮会导致线程也阻塞,把线程中VCL相关的代码都删掉就没问题了,按住系统按钮线程中的代码也会继续运行。

另外一个问题谁能解决呢? 如何像IE或者WIN自带的远程协助/远程桌面 那样,按住系统按钮也不会阻塞该窗口的绘图事件。
dataxdata 2012-06-29
  • 打赏
  • 举报
回复
你的程序有几个线程?
futurecs 2012-06-29
  • 打赏
  • 举报
回复
大多数的程序在按住系统按钮后就都停止工作了,比如WINRAR 在压缩过程中按住最小化,稍等一会儿鼠标移动到别处再松开,压缩进度还是跟按下之前一样的,Windows 自身的资源管理器在按住最小化的时候 里面的内容也停止刷新,但是例如IE 就不会,按住系统按钮的时候 网页的内容依然会播放, Windows 的远程协助,远程桌面,在按住系统按钮的时候,画面依然会更新,怎么才能实现呢
futurecs 2012-06-29
  • 打赏
  • 举报
回复
类似远程控制的程序,用UDP传输鼠标的指令,客户端发送WM_LBUTTONDOWN和WM_LBUTTONUP等领命到服务端,服务端接收后作出相应的操作,但是发现了一个问题,如果用客户端远程控制点击服务端主窗口的最小化按钮,服务端在只收到 WM_LBUTTONDOWN 后就会阻塞后续所有发来的消息,接下来的WM_LBUTTONUP 消息就被阻塞了,服务端就相当于按住了最小化按钮一直没松开,我用的Indy的UDP控件,会不会是控件的问题
dataxdata 2012-06-29
  • 打赏
  • 举报
回复
你的传输线程和主线程之间是什么关系?是否需要主线程不断向传输线程推送数据?
futurecs 2012-06-29
  • 打赏
  • 举报
回复
按住任意窗口上的系统按钮,线程中的代码也不运行了。
dataxdata 2012-06-29
  • 打赏
  • 举报
回复
把传输部分放在一个独立的线程中

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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