nsis利用ButtonEvent插件移动无标题窗口

众所周知,普通win窗口是带有标题栏的,标题栏的主要功用之一,就是可以方便的拖动窗体,但为了各式各样的目的,有时候我们不得不想办法将其消除,在nsis中主要是靠system插件调用系统函数改变窗体风格来实现,这不是本文的重点,略过,但我们将标题删除以后,最大的问题就是这个无标题窗体无法通过鼠标拖动,后来一些nsis爱好者研究出了一套有效的方法来解决这个问题,其主要原理基本都是靠第三方插件来截获和传递鼠标左键消息来实现。殊不知其实通过nsis自带的官方插件ButtonEvent一样可以实现,并且一点都不复杂。

首先在窗体合适的位置创建一个含有特定属性的STATIC控件。用 GetFunctionAddress获取函数地址。

System::Call`kernel32::GetModuleHandle(i 0) i.R3`
System::Call 'User32::CreateWindowEx(i0,t"STATIC",i0,i0x50020100,i0,i228,i423,i40,i$HWNDPARENT,i1130,i0,i0)i.R1'
SetCtlColors $R1""transparent
GetFunctionAddress $R1 TryMe
ButtonEvent::AddEventHandler /NOUNLOAD 1130 $R1
设定插件函数TryMe的响应内容

Function TryMe
SendMessage $HWNDPARENT ${wm_SysCommand} 0xF011 $R1
FunctionEnd
多说几句,关于0xF011:其实在msdn里面,能查阅到的是0xF010(SC_MOVE),但使用0xF010在nsis里面不起作用,最标准的做法应该是使用SC_MOVE + HTCAPTION(HTCAPTION=2),也就是0xF010+2=0xF012,与0xF011的区别仅在于移动的方式和位置不同。

 

 

posted on 2022-08-12 19:30  水晶石  阅读(92)  评论(0编辑  收藏  举报