分享

aardio学习笔记(1) 窗口样式操作

 ipilipala 2018-01-27
/*
    获取,添加,删除窗口样式和扩展样式
    主要用到的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*/);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多