读取所有非空主窗口标题及相应句柄

读取所有非空主窗口标题及相应句柄 公开

K_Y_D 分享于 2020-05-10 23:11 | 2 | 18
喜欢
zdf153 听风007 2 人喜欢了这个动作。
更多信息
分享人 K_Y_D
分享时间 2020-05-10 23:11
最后更新 19天1小时前
修订版本 7
Quicker版本 1.8.5.0

本动作基于或参考如下动作开发

https://getquicker.net/sharedaction?code=7a9fdf72-4347-479e-f827-08d7ed671986

说明

【功能/用途】读取所有非空主窗口标题及相应句柄

【备注】

最近更新

更新时间 修订版本 更新说明
19天1小时前 7
19天4小时前 6 简化部分步骤
21天3小时前 5 增加对资源管理器窗口的支持(要求Quick版本至少1.8.3)

补充信息

【注意】

  1. 第一次运行(自开机以来)时速度最慢(2~4秒),之后再次的运行较快(<1秒)。暂时无法解决。
  2. 进程越多,读取越慢
  3. 只是读取了所有标题不为空的主窗口,并不是所有窗口;一般一个进程就一个主窗口
  4. 对于  Key为窗口标题, Value为窗口句柄  的输出词典值,存在同名标题时,为了防止冲突,同名标题和句柄只读取第一个

【示例】

  zdf153编写的发送文字到窗口 (支持多窗口选择)动作


已隐藏 8 条评论。点击查看所有
  • K_Y_D 2020-05-16 21:34
    回复 @zdf153


    emmm,大概你同时运行的进程太多了,你这1.几秒,不慢了

  • zdf153 2020-05-16 21:36
    回复 @K_Y_D

    emmm,大概你同时运行的进程太多了,你这1.几秒,不慢了

    好吧  谢谢

  • K_Y_D 2020-05-16 21:37
    回复 @zdf153

    你开启多窗口没,我这边测试就是要2 3秒才可以弹出来

    开了,并不慢,你试试关闭大部分程序试试,可能这些程序占用的系统资源太多了

  • zdf153 2020-05-16 21:38

    ok  谢谢啦

  • zdf153 2020-05-18 10:17

    发现同一个应用有多个窗口的画只能扫描到上层的,比360极速浏览器,win10看图

  • K_Y_D 2020-05-18 11:04
    回复 @zdf153

    发现同一个应用有多个窗口的画只能扫描到上层的,比360极速浏览器,win10看图

    确实是这样,因为只是查找了主窗口(主窗口找起来快)。至于查找所有窗口的,我不大会写(因为C#语言我并不熟悉)。你可以去讨论区问问有谁会写读取所有窗口标题和句柄的子程序。

  • zdf153 2020-05-18 11:29
    回复 @K_Y_D

    确实是这样,因为只是查找了主窗口(主窗口找起来快)。至于查找所有窗口的,我不大会写(因为C#语言我并不熟悉)。你可以去讨论区问问有谁会写读取所有窗口标题和句柄的子程序。

    好吧  谢谢

  • zdf153 2020-05-18 11:44
    采纳率:42%11级 2013.05.24
    百度找的不知道行不行 看不懂
    获得窗体句柄可以用GetWindow方法获得窗体标题用GetWindowText方法,显示隐藏某个窗体用ShowWindow方法,给你举个例子

    using System.Runtime.InteropServices;

    private const int WS_VISIBLE = 268435456;//窗体可见
    private const int WS_MINIMIZEBOX = 131072;//有最小化按钮
    private const int WS_MAXIMIZEBOX = 65536;//有最大化按钮
    private const int WS_BORDER = 8388608;//窗体有边框
    private const int GWL_STYLE = (-16);//窗体样式
    private const int GW_HWNDFIRST = 0;
    private const int GW_HWNDNEXT = 2;
    private const int SW_HIDE = 0;
    private const int SW_SHOW = 5;

    [DllImport("User32.dll")]
    private extern static int GetWindow(int hWnd, int wCmd);
    [DllImport("User32.dll")]
    private extern static int GetWindowLongA(int hWnd, int wIndx);
    [DllImport("user32.dll")]
    private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private extern static int GetWindowTextLength(IntPtr hWnd);
    [DllImport("user32.dll")]
    public static extern int ShowWindow(int hwnd, int nCmdShow);

    //获得包含窗体可见、有边框、有最大化按钮的窗体的句柄和标题(窗体的属性出这几种外还有很多种)
    public static List<FromInfo> GetHandleList(int Handle)
    {
    List<FromInfo> fromInfo = new List<FromInfo>();
    int handle = GetWindow(Handle, GW_HWNDFIRST);
    while (handle > 0)
    {
    int IsTask = WS_VISIBLE | WS_BORDER | WS_MAXIMIZEBOX;//窗体可见、有边框、有最大化按钮
    int lngStyle = GetWindowLongA(handle, GWL_STYLE);
    bool TaskWindow = ((lngStyle & IsTask) == IsTask);
    if (TaskWindow)
    {
    int length = GetWindowTextLength(new IntPtr(handle));
    StringBuilder stringBuilder = new StringBuilder(2 * length + 1);
    GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
    string strTitle = stringBuilder.ToString();
    if (!string.IsNullOrEmpty(strTitle))
    {
    fromInfo.Add(new FromInfo(strTitle, handle));
    }
    else
    {
    fromInfo.Add(new FromInfo("", handle));
    }
    }
    handle = GetWindow(handle, GW_HWNDNEXT);
    }
    return fromInfo;
    }
    //获得所有窗体的句柄和标题
    public static List<FromInfo> GetHandleList(int Handle)
    {
    List<FromInfo> fromInfo = new List<FromInfo>();
    int handle = GetWindow(Handle, GW_HWNDFIRST);
    while (handle > 0)
    {
    int length = GetWindowTextLength(new IntPtr(handle));
    StringBuilder stringBuilder = new StringBuilder(2 * length + 1);
    GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
    string strTitle = stringBuilder.ToString();
    if (!string.IsNullOrEmpty(strTitle))
    {
    fromInfo.Add(new FromInfo(strTitle, handle));
    }
    else
    {
    fromInfo.Add(new FromInfo("", handle));
    }
    handle = GetWindow(handle, GW_HWNDNEXT);
    }
    return fromInfo;
    }

    public class FromInfo
    {
    public FromInfo(string title, int handle)
    {
    this.title = title;
    this.handle = handle;
    }
    private string title;
    private int handle;

    public string Title
    {
    get { return title; }
    set { title = value; }
    }
    public int Handle
    {
    get { return handle; }
    set { handle = value; }
    }
    }

    //获得窗体句柄和标题
    private void button1_Click(object sender, EventArgs e)
    {
    List<FromInfo> fromInfo = GetHandleList(this.Handle.ToInt32());
    }
    private void button2_Click(object sender, EventArgs e)
    {
    //隐藏窗体
    ShowWindow(this.Handle.ToInt32(), SW_HIDE);
    //显示窗体
    ShowWindow(this.Handle.ToInt32(), SW_SHOW);
    }
  • K_Y_D 2020-05-18 12:20
    回复 @zdf153
    采纳率:42%11级 2013.05.24
    百度找的不知道行不行 看不懂
    获得窗体句柄可以用GetWindow方法获得窗体标题用GetWindowText方法,显示隐藏某个窗体用ShowWindow方法,给你举个例子

    using System.Runtime.InteropServices;

    private const int WS_VISIBLE = 268435456;//窗体可见
    private const int WS_MINIMIZEBOX = 131072;//有最小化按钮
    private const int WS_MAXIMIZEBOX = 65536;//有最大化按钮
    private const int WS_BORDER = 8388608;//窗体有边框
    private const int GWL_STYLE = (-16);//窗体样式
    private const int GW_HWNDFIRST = 0;
    private const int GW_HWNDNEXT = 2;
    private const int SW_HIDE = 0;
    private const int SW_SHOW = 5;

    [DllImport("User32.dll")]
    private extern static int GetWindow(int hWnd, int wCmd);
    [DllImport("User32.dll")]
    private extern static int GetWindowLongA(int hWnd, int wIndx);
    [DllImport("user32.dll")]
    private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private extern static int GetWindowTextLength(IntPtr hWnd);
    [DllImport("user32.dll")]
    public static extern int ShowWindow(int hwnd, int nCmdShow);

    //获得包含窗体可见、有边框、有最大化按钮的窗体的句柄和标题(窗体的属性出这几种外还有很多种)
    public static List<FromInfo> GetHandleList(int Handle)
    {
    List<FromInfo> fromInfo = new List<FromInfo>();
    int handle = GetWindow(Handle, GW_HWNDFIRST);
    while (handle > 0)
    {
    int IsTask = WS_VISIBLE | WS_BORDER | WS_MAXIMIZEBOX;//窗体可见、有边框、有最大化按钮
    int lngStyle = GetWindowLongA(handle, GWL_STYLE);
    bool TaskWindow = ((lngStyle & IsTask) == IsTask);
    if (TaskWindow)
    {
    int length = GetWindowTextLength(new IntPtr(handle));
    StringBuilder stringBuilder = new StringBuilder(2 * length + 1);
    GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
    string strTitle = stringBuilder.ToString();
    if (!string.IsNullOrEmpty(strTitle))
    {
    fromInfo.Add(new FromInfo(strTitle, handle));
    }
    else
    {
    fromInfo.Add(new FromInfo("", handle));
    }
    }
    handle = GetWindow(handle, GW_HWNDNEXT);
    }
    return fromInfo;
    }
    //获得所有窗体的句柄和标题
    public static List<FromInfo> GetHandleList(int Handle)
    {
    List<FromInfo> fromInfo = new List<FromInfo>();
    int handle = GetWindow(Handle, GW_HWNDFIRST);
    while (handle > 0)
    {
    int length = GetWindowTextLength(new IntPtr(handle));
    StringBuilder stringBuilder = new StringBuilder(2 * length + 1);
    GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
    string strTitle = stringBuilder.ToString();
    if (!string.IsNullOrEmpty(strTitle))
    {
    fromInfo.Add(new FromInfo(strTitle, handle));
    }
    else
    {
    fromInfo.Add(new FromInfo("", handle));
    }
    handle = GetWindow(handle, GW_HWNDNEXT);
    }
    return fromInfo;
    }

    public class FromInfo
    {
    public FromInfo(string title, int handle)
    {
    this.title = title;
    this.handle = handle;
    }
    private string title;
    private int handle;

    public string Title
    {
    get { return title; }
    set { title = value; }
    }
    public int Handle
    {
    get { return handle; }
    set { handle = value; }
    }
    }

    //获得窗体句柄和标题
    private void button1_Click(object sender, EventArgs e)
    {
    List<FromInfo> fromInfo = GetHandleList(this.Handle.ToInt32());
    }
    private void button2_Click(object sender, EventArgs e)
    {
    //隐藏窗体
    ShowWindow(this.Handle.ToInt32(), SW_HIDE);
    //显示窗体
    ShowWindow(this.Handle.ToInt32(), SW_SHOW);
    }

    大概看了一下,应该也不能用于多标签的窗口

  • zdf153 2020-05-18 12:31
    回复 @K_Y_D

    大概看了一下,应该也不能用于多标签的窗口

    好吧

修订版本 更新时间 更新说明
7 19天1小时前
6 19天4小时前 简化部分步骤
5 21天3小时前 增加对资源管理器窗口的支持(要求Quick版本至少1.8.3)
4 27天13小时前 增加同名标题时的处理
3 2020-06-08 22:42