如何阻止 Windows 系统中的某个窗口关闭?

2020-07-12 16:07:03 +08:00
 Mindjet

我想阻止用户通过 Alt+F4 或单击“关闭”按钮关闭窗口。

如何做到这一点?

我想 WindowsAPI 可以做到,但我没有任何经验,也找不到具体的解决方案。

当然,能够实现它是很好的,不必使用特定的 API 。


背景:用 Word 来读书,关闭之后过了几天再找到想看的地方变得很难,Word2013 后自带了可以回到之前阅读位置的方法,但是那个东西很不稳定,经常保存不下来。我想在 word 关闭的时候,阻止关闭,并弹出通知提醒,先加入书签再退出。

1941 次点击
所在节点    Windows
11 条回复
zhyl
2020-07-12 16:10:58 +08:00
点击关闭按钮一般是发送 wm_close 消息,hook word 的消息处理函数可以拦截关闭。结束进程是 exitthread 函数,hook 它也能阻止关闭。
fuchunliu
2020-07-12 16:11:05 +08:00
打印成 pdf
kn007
2020-07-12 16:14:25 +08:00
最简单的应该是用 user32.dll 的 SetWindowLongPtrW 方法,把 SYSMENU 去掉
Mindjet
2020-07-12 16:17:28 +08:00
@kn007 #3 去掉之后,用 Alt+F4 也关不掉吗?
BBrother
2020-07-12 16:21:13 +08:00
如果一定要用 word 的话,可以把要读的部分字体变大,养成习惯就好
kn007
2020-07-12 16:24:32 +08:00
@Mindjet 哦,不好意思,没审题清楚,alt+f4 的话是 SendMessage 给窗口,只能 hook wm_close 信号。
你可以同样使用 SetWindowLongPtrW,然后注册个回调函数,函数抓取 wm_close 信号直接 return 1 就好了,确认无误想关闭的时候用 CallWindowProc 就可以了
Mindjet
2020-07-12 16:33:00 +08:00
@kn007 #6
@zhyl #1
谢谢两位,看来 Hook 是最好的方案,之前没接触过 WindowsAPI 的调用,准备去学学看。感觉上面的示例文档都是用 C 语言写的,学过点 Java,据说 C#和 Java 类似,而且是微软自家的,准备用 C#试试看。
ipwx
2020-07-12 16:47:13 +08:00
。。。说真的,我觉得打印成 PDF 然后用 whatever 阅读器,你的体验会好很多的。比你折腾这个有效多了。
Yourshell
2020-07-12 17:00:19 +08:00
刻舟求剑不可取
Mindjet
2020-07-12 17:28:13 +08:00
@ipwx #8 PDF 的主要特点是高度还原内容,在各种平台有良好的一致性,而且任何内容转成 PDF 都很简单。由于这些特点,作为阅读电子书格式的时候不可避免的有些缺点,之前一直用 PDF,现在主要用 Word,互有优劣。
Mindjet
2020-07-12 18:00:40 +08:00
@BBrother #5
现在感觉 PDF 太精准也未必好,如果某本书很长时间没看,复习上一段也是挺有好处的,看同一个内容获取的知识,居然还有不一样的地方。

之所以显得那么着急,主要是因为心里比较急迫,事实上大多时候都没必要精确。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689338

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX