怎么修改一个exe程序的视图重绘方式

xf_21 2020-01-17 11:19:07
让它总是全视图刷新,而不是经常局部刷新?

问题来源是这样的。公司要给word加假水印,就是不用word本身的水印功能,而是hook后,在paint消息的处理上动手脚。要求很奇葩,只能照做。

但是像word这样的程序重绘方式是很多样的。在word 响应paint消息之前,先在视图上输出水印文字行不通,因为word文档本身就有底色(周边的灰色区域,四个角的标记都是),会把之前输出的文字盖掉。

所以只能在word paint完了我再往上盖,但是这样也有很多问题难以解决,主要是word很多场合下会局部刷新,会带着我输出到hdc里的假水印文字一起走,我再盖的话就重叠了,做到不重叠很麻烦,有时候根本就无法叠上去。 在后画的总体思路下,最好的办法就是让word每次都全局刷新,这样我简单地网上画水印文字就好了。

求大佬支招。我做这个做到醉了。
...全文
222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xf_21 2020-01-19
  • 打赏
  • 举报
回复
引用 7 楼 许文君 的回复:
[quote=引用 6 楼 xf_21 的回复:]
[quote=引用 4 楼 许文君 的回复:]
api的hook也一样简单,hook iat表就行了,我觉得你这个完全可以换个思路,我们以前也有类似需求,我是这样搞的,当word被打开时插入真水印,当word被关闭时删除水印,在别的电脑上就没有了

再请教一下:

HWND hWnd = CreateWindowW( L"wordoverlaywnd", L"wordoverlaywnd", WS_CHILD | WS_EX_TOPMOST,x, y, w, h, hWndParent, NULL, hInstance, NULL);//WS_CHILD WS_POPUP

。。。。。。。。
。。。。。。。。
SetWindowLong(hWnd, GWL_STYLE, WS_EX_TOPMOST);

SetWindowLong( hWnd , GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST);

SetLayeredWindowAttributes(hWnd, 0, 180, LWA_ALPHA );

如上面,我的意思是建一个子窗口,放在程序的最顶层,并且透明,以便鼠标键盘事件穿下去,而且还能随着主窗口的移动而自行移动。但是发现,设置为顶层窗口后,透明效果没有了。怎么办啊,怎么做才能达到我的目的。[/quote]
这个你搜一下把,有可能是exstyle相互影响了,单纯设置透明并topmost是OK的[/quote]

感谢,搞定了
许文君 2020-01-17
  • 打赏
  • 举报
回复
引用 6 楼 xf_21 的回复:
[quote=引用 4 楼 许文君 的回复:] api的hook也一样简单,hook iat表就行了,我觉得你这个完全可以换个思路,我们以前也有类似需求,我是这样搞的,当word被打开时插入真水印,当word被关闭时删除水印,在别的电脑上就没有了
再请教一下: HWND hWnd = CreateWindowW( L"wordoverlaywnd", L"wordoverlaywnd", WS_CHILD | WS_EX_TOPMOST,x, y, w, h, hWndParent, NULL, hInstance, NULL);//WS_CHILD WS_POPUP 。。。。。。。。 。。。。。。。。 SetWindowLong(hWnd, GWL_STYLE, WS_EX_TOPMOST); SetWindowLong( hWnd , GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST); SetLayeredWindowAttributes(hWnd, 0, 180, LWA_ALPHA ); 如上面,我的意思是建一个子窗口,放在程序的最顶层,并且透明,以便鼠标键盘事件穿下去,而且还能随着主窗口的移动而自行移动。但是发现,设置为顶层窗口后,透明效果没有了。怎么办啊,怎么做才能达到我的目的。[/quote] 这个你搜一下把,有可能是exstyle相互影响了,单纯设置透明并topmost是OK的
xf_21 2020-01-17
  • 打赏
  • 举报
回复
引用 4 楼 许文君 的回复:
api的hook也一样简单,hook iat表就行了,我觉得你这个完全可以换个思路,我们以前也有类似需求,我是这样搞的,当word被打开时插入真水印,当word被关闭时删除水印,在别的电脑上就没有了
再请教一下: HWND hWnd = CreateWindowW( L"wordoverlaywnd", L"wordoverlaywnd", WS_CHILD | WS_EX_TOPMOST,x, y, w, h, hWndParent, NULL, hInstance, NULL);//WS_CHILD WS_POPUP 。。。。。。。。 。。。。。。。。 SetWindowLong(hWnd, GWL_STYLE, WS_EX_TOPMOST); SetWindowLong( hWnd , GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST); SetLayeredWindowAttributes(hWnd, 0, 180, LWA_ALPHA ); 如上面,我的意思是建一个子窗口,放在程序的最顶层,并且透明,以便鼠标键盘事件穿下去,而且还能随着主窗口的移动而自行移动。但是发现,设置为顶层窗口后,透明效果没有了。怎么办啊,怎么做才能达到我的目的。
xf_21 2020-01-17
  • 打赏
  • 举报
回复
引用 4 楼 许文君 的回复:
api的hook也一样简单,hook iat表就行了,我觉得你这个完全可以换个思路,我们以前也有类似需求,我是这样搞的,当word被打开时插入真水印,当word被关闭时删除水印,在别的电脑上就没有了
再请教一下: HWND hWnd = CreateWindowW( L"wordoverlaywnd", L"wordoverlaywnd", WS_CHILD | WS_EX_TOPMOST,x, y, w, h, hWndParent, NULL, hInstance, NULL);//WS_CHILD WS_POPUP 。。。。。。。。 。。。。。。。。 SetWindowLong(hWnd, GWL_STYLE, WS_EX_TOPMOST); SetWindowLong( hWnd , GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST); SetLayeredWindowAttributes(hWnd, 0, 180, LWA_ALPHA ); 如上面,我的意思是建一个子窗口,放在程序的最顶层,并且透明,以便鼠标键盘事件穿下去,而且还能随着主窗口的移动而自行移动。但是发现,设置为顶层窗口后,透明消息了。怎么办啊,怎么做才能达到我的目的。
许文君 2020-01-17
  • 打赏
  • 举报
回复
api的hook也一样简单,hook iat表就行了,我觉得你这个完全可以换个思路,我们以前也有类似需求,我是这样搞的,当word被打开时插入真水印,当word被关闭时删除水印,在别的电脑上就没有了
许文君 2020-01-17
  • 打赏
  • 举报
回复
引用 2 楼 xf_21 的回复:
[quote=引用 1 楼 许文君 的回复:] 那你要不hook invalidrect?话说你们公司是做什么业务的啊,还有这种业务。
没搞过api的hook,回头再考虑这个办法。 刚想了一个办法,干脆我在word上建一个背景透明的窗口,把假水印文字画在里头,让它随着word动好了。这个办法你看行不行?[/quote] word本身是否会被编辑?如需要被编辑比如绘图啊什么的,用户那块区域就操作不了了。
xf_21 2020-01-17
  • 打赏
  • 举报
回复
引用 1 楼 许文君 的回复:
那你要不hook invalidrect?话说你们公司是做什么业务的啊,还有这种业务。
没搞过api的hook,回头再考虑这个办法。 刚想了一个办法,干脆我在word上建一个背景透明的窗口,把假水印文字画在里头,让它随着word动好了。这个办法你看行不行?
许文君 2020-01-17
  • 打赏
  • 举报
回复
那你要不hook invalidrect?话说你们公司是做什么业务的啊,还有这种业务。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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