想获得任务栏中所有打开窗口的窗口标题和托盘运行程序的程序标题或进程句柄

时间:2023-02-04 08:06:48
想获得任务栏中所有打开窗口的窗口标题和托盘运行程序的程序标题或进程句柄
最近研究了一下windowAPI,发现不是很懂,特地过来请教一下
[DllImport("User32.dll")]
        public static extern int EnumWindows(CallBack x, int y);//所有进程窗口

        [DllImport("User32.dll")]
        public extern static int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
        public static bool Report(int hwnd, int lParam)
        {
            string name = "";
            StringBuilder windowname = new StringBuilder(50000);
            if (GetWindowText(hwnd, windowname, 50000) > 0)
            {
                name = windowname.ToString();
            }
            if (name.Length > 0)
            {
                MessageBox.Show("Window handle is :" + hwnd + "名字为" + name + "\n");
            }
            return true;
        }

        public delegate bool CallBack(int hwnd, int lParam);
        private void Form1_Load(object sender, EventArgs e)
        {
            CallBack myCallBack = new CallBack(Report);
            EnumWindows(myCallBack, 0);
}

我现在这样是可以获取到所有窗口名,但是有很多信息是没用的,我要过滤掉请问有没有什么好方法

5 个解决方案

#1


有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

#2


引用 1 楼 caozhy 的回复:
有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

调用了这个方法可是得出的值还有会有差别,多了一个开始和一个prarem manager,然后就是请问如何捕获右下角的托盘程序和隐藏窗体的方法是一样的吗

#3


引用 2 楼 q510181751 的回复:
Quote: 引用 1 楼 caozhy 的回复:

有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

调用了这个方法可是得出的值还有会有差别,多了一个开始和一个prarem manager,然后就是请问如何捕获右下角的托盘程序和隐藏窗体的方法是一样的吗

托盘程序有些是最小化和隐藏,有些是关闭重开。所以没有通用和可靠的做法。

#4


引用 3 楼 caozhy 的回复:
Quote: 引用 2 楼 q510181751 的回复:

Quote: 引用 1 楼 caozhy 的回复:

有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

调用了这个方法可是得出的值还有会有差别,多了一个开始和一个prarem manager,然后就是请问如何捕获右下角的托盘程序和隐藏窗体的方法是一样的吗

托盘程序有些是最小化和隐藏,有些是关闭重开。所以没有通用和可靠的做法。

我如果要获取迅雷的隐藏托盘句柄,用findwindow能可行吗?因为我看网上很多这种工具,只是想弄清楚当中的原理

#5


我已经告诉你了。取决于程序本身。如果是窗口关闭重开的,就取不到。

#1


有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

#2


引用 1 楼 caozhy 的回复:
有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

调用了这个方法可是得出的值还有会有差别,多了一个开始和一个prarem manager,然后就是请问如何捕获右下角的托盘程序和隐藏窗体的方法是一样的吗

#3


引用 2 楼 q510181751 的回复:
Quote: 引用 1 楼 caozhy 的回复:

有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

调用了这个方法可是得出的值还有会有差别,多了一个开始和一个prarem manager,然后就是请问如何捕获右下角的托盘程序和隐藏窗体的方法是一样的吗

托盘程序有些是最小化和隐藏,有些是关闭重开。所以没有通用和可靠的做法。

#4


引用 3 楼 caozhy 的回复:
Quote: 引用 2 楼 q510181751 的回复:

Quote: 引用 1 楼 caozhy 的回复:

有一些系统的隐藏窗口,比如自动完成提示、输入法、电源等等,你可以建立一个列表,然后比对后过滤。

当然,如果你不要任何隐藏窗口,直接调用IsWindowVisible函数

调用了这个方法可是得出的值还有会有差别,多了一个开始和一个prarem manager,然后就是请问如何捕获右下角的托盘程序和隐藏窗体的方法是一样的吗

托盘程序有些是最小化和隐藏,有些是关闭重开。所以没有通用和可靠的做法。

我如果要获取迅雷的隐藏托盘句柄,用findwindow能可行吗?因为我看网上很多这种工具,只是想弄清楚当中的原理

#5


我已经告诉你了。取决于程序本身。如果是窗口关闭重开的,就取不到。