剥离第一阶段需要做的函数,梳理关系,新增测试dll工程
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user