/*
获取,添加,删除窗口样式和扩展样式
主要用到的api函数GetWindowLong
函数原型:
LONG WINAPI GetWindowLong(
_In_ HWND hWnd,
_In_ int nIndex
);
在aau中声明
var u = ::User32;
::GetWindowLong = u.api("GetWindowLongA","int(addr hwnd,int nIndex)" )
第一个参数是要获取信息的窗口句柄
第二个参数是一个指定值,这个值名称以gwl开头,用来确定取的是什么信息!
如:GWL_STYLE = -16 获得窗口风格。
*/
//例子1 获取窗口样式
import winex; //winex已包含win库
import process;
process. execute ( "notepad.exe" );
var hwnd = winex.wait(,, "Notepad" ); //获取窗口句柄
var style = win.getStyle(hwnd);
win.msgbox( tostring (style , 16), "窗口样式" );
/*
上面例子只是获取窗口的样式,getStyle还有两个参数
利用位运算符来确定"限定样式"和"不允许包含的样式"
*/
//例子2 第二个参数用法
import winex; //winex已包含win库
import process;
process. execute ( "notepad.exe" );
var hwnd = winex.wait(,, "Notepad" ); //获取窗口句柄
var style = win.getStyle(hwnd , 0xC00000 /*_WS_CAPTION*/ );
win.msgbox( tostring (style , 16), "包含WS_CAPTION样式" ); //成功返回包含样式,失败返回0
//例子3 第三个参数用法,跟第二个参数相反
import winex; //winex已包含win库
import process;
process. execute ( "notepad.exe" );
var hwnd = winex.wait(,, "Notepad" ); //获取窗口句柄
var style = win.getStyle(hwnd,,0x40000000 /*_WS_CHILD*/ );
win.msgbox( tostring (style , 16), "不包含WS_CHILD样式,返回窗口样式" ); //失败表示包含样式返回0
/*
上面3个例子已经说明getStyle的用法,而getStyleEx用法类似
只是变成扩展样式,GetWindowLong第二个参数变成GWL_EXSTYLE
getStyle和getStyleEx是取(扩展)样式和(扩展)检测样式
那么(扩展)添加和删除(扩展)样式就用到modifyStyle和modifyStyleEx
这里用到了设置(扩展)样式api函数SetWindowLong
函数原型:
LONG WINAPI SetWindowLong(
_In_ HWND hWnd,
_In_ int nIndex,
_In_ LONG dwNewLong
);
在aau中声明
::SetWindowLong = u.api("SetWindowLongA","int(addr hwnd,int nIndex,int dwNewLong)" )
前面二个参数跟GetWindowLong相同,而最后一个参数就是设置的值
modifyStyle函数先使用GetWindowLong取得窗口样式再使用位运算
移除或添加样式得到新值,再用SetWindowLong设置这个新值!
*/
//例子4 移除样式
import winex; //winex已包含win库
import process;
process. execute ( "notepad.exe" );
var hwnd = winex.wait(,, "Notepad" ); //获取窗口句柄
win.modifyStyle(hwnd , 0xC00000 /*_WS_CAPTION*/ ); //移除标题栏
//例子5 添加样式
import winex; //winex已包含win库
import process;
process. execute ( "notepad.exe" );
var hwnd = winex.wait(,, "Notepad" ); //获取窗口句柄
win.modifyStyle(hwnd,,0x8000000 /*_WS_DISABLED*/ ); //改为不可用的窗口:)
/*
modifyStyleEx实际还是用了modifyStyle,只不过变成扩展样式的
而细心看下modifyStyle的源码,会发现第四个参数应用在api函数SetWindowPos
有些窗口数据被缓存,如果使用SetWindowLong之后不调用SetWindowPos就不会生效
特别是一些框架样式!
*/
//例子6 窗口添加水平滚动条
import winex; //winex已包含win库
import process;
process. execute ( "notepad.exe" );
var hwnd = winex.wait(,, "Notepad" ); //获取窗口句柄
//SWP_FRAMECHANGED给窗口发送WM_NCCALCSIZE消息,也就是通知目标窗口需要重新计算客户区/非客户区
win.modifyStyle(hwnd,,0x100000 /*_WS_HSCROLL*/ ,0x20 /*_SWP_FRAMECHANGED*/ );
|