找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3545|回复: 0

[教程源码] [转载][361度]设置窗口附加数据

[复制链接]
  • 打卡等级:坠落山崖

1082

主题

2107

回帖

4291

积分

院长

鲜花
7
猫粮
7505
QQ
发表于 2018-10-11 19:53:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

大家在写脚本的过程中可能碰到过想在目标窗口中保存字符串数据的情况,这次展示的脚本例子就是解决这个问题的。


给目标窗口设置附加数据有多种方法:最简单的是修改目标窗口的标题,但这个方法很暴力,不但影响用户体验,而且可能被目标进程监测。还可以将窗口句柄和附加数据保存在数组中,这个操作麻烦些,不支持跨线程和跨进程读取数据。也可以将窗口句柄和附加数据保存在文件中,这个多线程同时读写数据要解决冲突问题,而且不小心会留下文件垃圾。 这里使用在目标窗口中创建子窗口,修改子窗口标题的方法来设置窗口附加数据,能比较好地解决这些问题,它可以跨线程和进程访问窗口附加数据。虽然麻烦点,但这里已经写成函数了,直接复制和调用即可。例子如下:


[按键精灵] 纯文本查看 复制代码
'获得当前窗口的窗口句柄
'获得当前窗口句柄
hwnd = Plugin.WndEx7_20.GetForegroundWindow()
'设置窗口附加字符串
'窗口ID的取值范围建议是1-65534,另外选择窗口ID不能是它的兄弟窗口已使用的窗口ID,否则可能有冲突。窗口ID的值可以随便设置。
Call SetWndExtraString(hwnd, 971, "窗口附加数据")
'获得窗口附加字符串。窗口ID要和设置窗口附加字符串相同
MsgBox GetWndExtraString(hwnd, 971), 4096
'脚本退出时执行此过程
Sub OnScriptExit()
    '移除窗口附加字符串。窗口ID要和设置窗口附加字符串相同
    Call RemoveWndExtraString(hwnd,971)
End Sub

'设置窗口附加字符串。第一个参数是窗口句柄,第二个参数是窗口ID,第三个参数是要设置的字符串
Function SetWndExtraString(hwnd, wid, str)
    Dim hwndChild
    '判断窗口是否存在
    If Not Plugin.WndEx7_20.GetWindowState(hwnd, 0)  Then 
        SetWndExtraString = False
        Exit Function
    End If
    '根据窗口ID查找子窗口
    hwndChild = Plugin.WndEx7_20.FindWindowId(hwnd, wid)
    If hwndChild = 0 Then 
        '在选中的窗口中创建文本显示区域(这是个窗口)
        hwndChild = Plugin.WndEx7_20.CreateTextRgn(hwnd, 0, 0, 0, 0)
        If hwndChild = 0 Then 
            SetWndExtraString = False
            Exit Function
        End If
        '设置窗口ID
        Call Plugin.WndEx7_20.SetWindowId(hwndChild, wid)
    End If
    '设置窗口标题
    Call Plugin.WndEx7_20.SetWindowText(hwndChild,str)
    SetWndExtraString = True
End Function

'获得窗口附加字符串。第一个参数是窗口句柄,第二个参数是窗口ID,返回窗口的附加字符串
Function GetWndExtraString(hwnd, wid)
    Dim hwndChild
    '判断窗口是否存在
    If Not Plugin.WndEx7_20.GetWindowState(hwnd, 0)  Then 
        GetWndExtraString = vbNullString
        Exit Function
    End If
    '根据窗口ID查找子窗口
    hwndChild = Plugin.WndEx7_20.FindWindowId(hwnd, wid)
    If hwndChild = 0 Then 
        GetWndExtraString = vbNullString
        Exit Function
    End If
    '获得窗口标题
    GetWndExtraString = Plugin.WndEx7_20.GetWindowInfo(hwndChild, 0)
End Function

'移除窗口附加字符串,不使用该窗口附加字符串时需调用它。第一个参数是窗口句柄,第二个参数是窗口ID
Function RemoveWndExtraString(hwnd, wid)
    Dim hwndChild
    '判断窗口是否存在
    If Not Plugin.WndEx7_20.GetWindowState(hwnd, 0)  Then 
        RemoveWndExtraString = False
        Exit Function
    End If
    '根据窗口ID查找子窗口
    hwndChild = Plugin.WndEx7_20.FindWindowId(hwnd, wid)
    If hwndChild = 0 Then 
        RemoveWndExtraString = True
        Exit Function
    End If
    '关闭窗口
    Call Plugin.WndEx7_20.SetWindowState(hwndChild, 0)
    RemoveWndExtraString = True
End Function

SetWndExtraString、GetWndExtraString、RemoveWndExtraString对同一个附加数据操作要使用相同的窗口ID。通过设置不同的窗口ID可以设置多个附加字符串。使用SetWndExtraString要注意设置的窗口ID不要目标窗口已存在的子窗口的窗口ID相同。



脚本中使用的361度窗口插件下载:
http://pan.baidu.com/s/1ntQswaP

本文转载于361度插件作者博客
http://bg361.blog.163.com/
楼主热帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫猫编程学园

GMT+8, 2024-4-24 15:25

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表