手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#获取进程的主窗口句柄的实现方法
C#获取进程的主窗口句柄的实现方法
摘要:通过调用Win32API实现。复制代码代码如下:publicclassUser32API{privatestaticHashtablepro...

通过调用Win32 API实现。

复制代码 代码如下:

public class User32API

{

private static 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)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;

}

}

调用User32API.GetCurrentWindowHandle()即可返回当前进程的主窗口句柄,如果获取失败则返回IntPtr.Zero。

--EOF--

【C#获取进程的主窗口句柄的实现方法】相关文章:

c#简单读取文本的实例方法

TextBox获取输入焦点时自动全选的实现方法

WinForm子窗体访问父窗体控件的实现方法

C# 透明窗体制作实现方法比较分析

关于C#生成MongoDB中ObjectId的实现方法

C#用Lambda和委托实现模板方法

用C#编写获取远程IP,MAC的方法

C#中隐式运行CMD命令行窗口的方法

C#获取系统版本信息方法

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

精品推荐
分类导航