|
|
|
|
using KGIS.Framework.Utils;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace Kingo.Plugin.EngineEditor.Common
|
|
|
|
|
{
|
|
|
|
|
public class GetAllDesktopWindows
|
|
|
|
|
{
|
|
|
|
|
private delegate bool WNDENUMPROC(IntPtr hWnd, int lParam);
|
|
|
|
|
|
|
|
|
|
//用来遍历所有窗口
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);
|
|
|
|
|
|
|
|
|
|
//获取窗口Text
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
|
|
|
|
|
|
|
|
|
|
//获取窗口类名
|
|
|
|
|
[DllImport("user32.dll")]
|
|
|
|
|
private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
|
|
|
|
|
|
|
|
|
|
[DllImport("user32.dll", EntryPoint = "IsWindow")]
|
|
|
|
|
public static extern bool IsWindow(IntPtr hWnd);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 自定义一个类,用来保存句柄信息,在遍历的时候,随便也用空上句柄来获取些信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
public struct WindowInfo
|
|
|
|
|
{
|
|
|
|
|
public IntPtr hWnd;
|
|
|
|
|
public string szWindowName;
|
|
|
|
|
public string szClassName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<WindowInfo> ToGetAllDesktopWindows()
|
|
|
|
|
{
|
|
|
|
|
//用来保存窗口对象 列表
|
|
|
|
|
List<WindowInfo> wndList = new List<WindowInfo>();
|
|
|
|
|
List<WindowInfo> wndList_IsWindows = new List<WindowInfo>();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
//enum all desktop windows
|
|
|
|
|
EnumWindows(delegate (IntPtr hWnd, int lParam)
|
|
|
|
|
{
|
|
|
|
|
WindowInfo wnd = new WindowInfo();
|
|
|
|
|
StringBuilder sb = new StringBuilder(256);
|
|
|
|
|
|
|
|
|
|
//get hwnd
|
|
|
|
|
wnd.hWnd = hWnd;
|
|
|
|
|
|
|
|
|
|
//get window name
|
|
|
|
|
GetWindowTextW(hWnd, sb, sb.Capacity);
|
|
|
|
|
wnd.szWindowName = sb.ToString();
|
|
|
|
|
|
|
|
|
|
//get window class
|
|
|
|
|
GetClassNameW(hWnd, sb, sb.Capacity);
|
|
|
|
|
wnd.szClassName = sb.ToString();
|
|
|
|
|
|
|
|
|
|
//add it into list
|
|
|
|
|
wndList.Add(wnd);
|
|
|
|
|
return true;
|
|
|
|
|
}, 0);
|
|
|
|
|
|
|
|
|
|
if (wndList != null && wndList.Count() > 0)
|
|
|
|
|
{
|
|
|
|
|
for (int u = 0; u < wndList.Count(); u++)
|
|
|
|
|
{
|
|
|
|
|
if (wndList[u].hWnd != IntPtr.Zero && IsWindow(wndList[u].hWnd) == true)//不为空且是窗口
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrWhiteSpace(wndList[u].szWindowName) == false)
|
|
|
|
|
{
|
|
|
|
|
wndList_IsWindows.Add(wndList[u]);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return wndList_IsWindows;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogAPI.Debug("获取所有窗口句柄时失败,异常原因: " + ex + " ; ");
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
if (wndList != null && wndList.Count() > 0)
|
|
|
|
|
{
|
|
|
|
|
wndList = null;
|
|
|
|
|
}
|
|
|
|
|
if (wndList_IsWindows != null && wndList_IsWindows.Count() > 0)
|
|
|
|
|
{
|
|
|
|
|
wndList_IsWindows = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|