防止整个屏幕更新

4

编辑1:实际上,我只是想避免关闭一个Word文档并打开另一个文档时引起的闪烁。但现在看来,这种方法不可行。

问候,是否有可能防止整个屏幕(而不仅仅是桌面)更新?这个问题源自这个。我的Word插件中,我想要做的是,在关闭一个Word文档并打开另一个文档时锁定整个屏幕更新,并在完成后重新启用更新。

一个想法是:

  1. 获取整个屏幕的图像(如何?);
  2. 显示一个最顶部的窗口,以展示步骤1中捕获的屏幕图像,覆盖整个屏幕;
  3. 完成工作后关闭最顶部的窗口。

这是可能的吗?或者您有其他更好的想法吗?谢谢!


8
警告:应用程序(更糟糕的是,一个文字处理应用程序的附加组件)这种行为可能被认为是边缘恶意软件(“劫持其他应用程序和/或窗口管理器的控制?检查。防止用户操作其他应用程序?检查。”)。我相信你的意图是纯洁的,但如果我作为用户第一次遇到这种情况,我会变得极度偏执并且抱怨不已(“我安装了这个附加组件,现在它阻止屏幕更新,它想隐藏什么信息?”),除非这种转换确实是你的附加组件的目的。 - Piskvor left the building
2
首先打开新文档。一旦它出现了,关闭旧文档。完全不需要锁定屏幕。 - Rob Kennedy
7
无论这个插件是什么,我都不希望它靠近我的电脑。 - David Heffernan
2
@Edwin:你的意思是只需要不到一秒钟就可以完成。但考虑到如果发生任何错误(在自动化中,可能出于代码之外的原因),您会让用户的计算机挂起。 - Larry Lustig
2
我正在给这个问题点赞,因为评论非常有价值。 - Chris Thornton
显示剩余8条评论
2个回答

7

不要这样做。

没有任何应用程序、插件或其他代码可以比用户拥有的UI更特殊,即使只是短暂的干扰。

The Old New Thing (Raymond Chen) 在这方面有一些非常好的帖子,包括LockWindowUpdate锁定小工具位置和其他对用户不友好的功能

生活在一个多线程的世界里,意味着你应该期望你的用户会同时做多件事情。

为了“看起来漂亮”而锁定任何东西 - 即使只是短暂的时间 - 是完全不可行的。

你的请求只是走向可怕的系统模态对话框“您确定要对计算机进行这个坏事吗?”的第一步,其中有“是”和“否”按钮,其中“是”是默认按钮,在用户输入长篇故事时按下空格键。

--jeroen


3
“是的,让我们在这里禁用UI,只需要一会儿——Word遇到了问题并需要关闭。 对此给您带来的不便我们深感抱歉。” @ Edwin:UI已被禁用,并且应该重新启用它的进程已经不存在了。现在怎么办?(不要说“Windows用户习惯重启”,现在已经不是1998年了) - Piskvor left the building

0

为防止屏幕更新:

SendMessage(GetDesktopWindow, WM_SETREDRAW, 0, 0);

重新启用屏幕更新:

SendMessage(GetDesktopWindow, WM_SETREDRAW, 1, 0);

1
那么所有作为顶层窗口的应用程序呢? - David Heffernan
3
如果你的插件在第一条和第二条消息之间崩溃了怎么办?(当然,你的代码永远不会崩溃。那么,如果Word崩溃并带着你的插件一起崩溃呢?)这是否需要登录-注销、重新启动或采取更加激烈的措施来修复?(不是钓鱼,只是好奇) - Piskvor left the building
感谢glob,它似乎可以禁用桌面的绘制,但这会导致错误,并且使用你提供的第二行代码无法恢复绘制。也许这种方法会导致不可预测的问题... - Edwin Yip
2
@Edwin,也许整个错误的想法会导致非常可预测的问题...... - David Heffernan
1
@David,你说得对,我一直在为解决我的问题(在同一个Word窗口中重新打开Word文档)而苦苦思索,所以也许这不是一个好主意... - Edwin Yip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接