none
有关FindWindowEx的问题 RRS feed

  • 问题

  • 我通过FindWindowEx和IsWindowVisible来获取桌面上所有可见窗口,可是返回的结果中包含下面几个:

    Microsoft Text Input Application 0,0,1920,1080(后面这个数字是坐标,通过GetWindowRect获取)
    Microsoft Text Input Application 0,0,1920,1080
    Microsoft Text Input Application 0,0,1920,1080
    Windows 默认锁屏界面 0,0,1920,1080
    启动 0,0,1920,1034
    Windows Shell Experience 主机 0,0,1920,1080
    设置 0,1,1200,822
    设置 485,161,1701,991
    Microsoft Text Input Application 0,0,1920,1080
    Program Manager 0,0,1920,1080

    这些窗口实际并不visible,为何会列出来?有什么方法排除掉这些窗口(不能通过窗口标题来排除,因为不同语言的Windows估计这个标题也不一样)?


    da jia hao!

    2020年8月26日 8:25

全部回复

  • Hi liubin,

    根据你的描述,你想要获取到桌面上所有可见的窗口。

    在你的显示结果出现了Microsoft Text Input Application这个窗口,其实它是你的键盘窗口,只不过缩小了。

    如下图:

    点击那个键盘他就会显示出来,这个和你窗口缩小化的道理是一样的

    另外,我是用的下面的代码来获取的窗口信息,你可以看下,虽然也能获取到键盘窗口,但是其他的都正常。

    public class user32
        {
            /// <summary>
            /// filter function
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="lParam"></param>
            /// <returns></returns>
            public delegate bool EnumDelegate(IntPtr hWnd, int lParam);
            /// <summary>
            /// check if windows visible
            /// </summary>
            /// <param name="hWnd"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool IsWindowVisible(IntPtr hWnd);
    
            /// <summary>
            /// return windows text
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="lpWindowText"></param>
            /// <param name="nMaxCount"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "GetWindowText",
            ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
            public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
    
            /// <summary>
            /// enumarator on all desktop windows
            /// </summary>
            /// <param name="hDesktop"></param>
            /// <param name="lpEnumCallbackFunction"></param>
            /// <param name="lParam"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows",
            ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);
    
            /// <summary>
            /// entry point of the program
            /// </summary>
            static void Main()
            {
                var collection = new List<string>();
                user32.EnumDelegate filter = delegate (IntPtr hWnd, int lParam)
                {
                    StringBuilder strbTitle = new StringBuilder(255);
                    int nLength = user32.GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
                    string strTitle = strbTitle.ToString();
    
                    if (user32.IsWindowVisible(hWnd) && string.IsNullOrEmpty(strTitle) == false)
                    {
                        collection.Add(strTitle);
                    }
                    return true;
                };
    
                if (user32.EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero))
                {
                    foreach (var item in collection)
                    {
                        Console.WriteLine(item);
                    }
                }
                Console.Read();
            }
        }

    希望这会对你有所帮助。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2020年8月27日 2:10
    版主
  • 我代码和你差不多,现在的问题是,得到的结果中包含一些明明你看不见它但是IsWindowVisible又返回true的窗口,例如:

    文件资源管理器 的跳转列表

    Cortana (小娜)

    Microsoft Text Input Application

    Windows 默认锁屏界面

    这些窗口实际上并不可见,但是IsWindowVisible却返回true,这使得我得到了错误的结果。

    我当然可以用标题来排除掉这些窗口,但是首先不同语言的windows系统这些窗口的标题就不一样,所以这个方法不可取。其次也不知道还会不会有其他类似的窗口。

    所以就想知道,这些窗口都有哪些特征?


    da jia hao!

    2020年8月27日 8:24