88 lines
2.4 KiB
C#
88 lines
2.4 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Collections;
|
|
|
|
namespace HSI_SEVENOCEAN_EF1_CsTest
|
|
{
|
|
class User32Api
|
|
{
|
|
private static readonly Hashtable ProcessWnd = null;
|
|
|
|
public delegate bool Wndenumproc(IntPtr hwnd, uint lParam);
|
|
|
|
static User32Api()
|
|
{
|
|
if (ProcessWnd == null)
|
|
{
|
|
ProcessWnd = new Hashtable();
|
|
}
|
|
}
|
|
|
|
[DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)]
|
|
public static extern bool EnumWindows(Wndenumproc lpEnumFunc, uint lParam);
|
|
|
|
[DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]
|
|
public static extern IntPtr GetParent(IntPtr hWnd);
|
|
|
|
[DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")]
|
|
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);
|
|
|
|
[DllImport("user32.dll", EntryPoint = "IsWindow")]
|
|
public static extern bool IsWindow(IntPtr hWnd);
|
|
|
|
[DllImport("kernel32.dll", EntryPoint = "SetLastError")]
|
|
public static extern void SetLastError(uint dwErrCode);
|
|
|
|
public static IntPtr GetCurrentWindowHandle()
|
|
{
|
|
IntPtr ptrWnd = IntPtr.Zero;
|
|
uint uiPid = (uint)System.Diagnostics.Process.GetCurrentProcess().Id; // 当前进程 ID
|
|
object objWnd = ProcessWnd[uiPid];
|
|
|
|
if (objWnd != null)
|
|
{
|
|
ptrWnd = (IntPtr)objWnd;
|
|
if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd)) // 从缓存中获取句柄
|
|
{
|
|
return ptrWnd;
|
|
}
|
|
else
|
|
{
|
|
ptrWnd = IntPtr.Zero;
|
|
}
|
|
}
|
|
|
|
bool bResult = EnumWindows(new Wndenumproc(EnumWindowsProc), uiPid);
|
|
// 枚举窗口返回 false 并且没有错误号时表明获取成功
|
|
if (!bResult && Marshal.GetLastWin32Error() == 0)
|
|
{
|
|
objWnd = ProcessWnd[uiPid];
|
|
if (objWnd != null)
|
|
{
|
|
ptrWnd = (IntPtr)objWnd;
|
|
}
|
|
}
|
|
|
|
return ptrWnd;
|
|
}
|
|
|
|
private static bool EnumWindowsProc(IntPtr hwnd, uint lParam)
|
|
{
|
|
uint uiPid = 0;
|
|
|
|
if (GetParent(hwnd) == IntPtr.Zero)
|
|
{
|
|
GetWindowThreadProcessId(hwnd, ref uiPid);
|
|
if (uiPid == lParam) // 找到进程对应的主窗口句柄
|
|
{
|
|
ProcessWnd[uiPid] = hwnd; // 把句柄缓存起来
|
|
SetLastError(0); // 设置无错误
|
|
return false; // 返回 false 以终止枚举窗口
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
} |