通过调用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#根据excel数据绘制坐标图的方法

    C#根据excel数据绘制坐标图的方法

    这篇文章主要为大家详细介绍了C#根据excel数据绘制坐标图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#实现基于Base64的加密解密类实例

    C#实现基于Base64的加密解密类实例

    这篇文章主要介绍了C#实现基于Base64的加密解密类,实例分析了C#基于Base64的加密解密实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • c# 使用计时器和观察者模式实现报警推送需求

    c# 使用计时器和观察者模式实现报警推送需求

    这篇文章主要介绍了c# 使用计时器和观察者模式实现报警推送需求,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • WPF调用Matlab函数的方法

    WPF调用Matlab函数的方法

    这篇文章主要为大家详细介绍了WPF调用Matlab函数的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • winform开发使用通用多线程基类分享(以队列形式)

    winform开发使用通用多线程基类分享(以队列形式)

    多线程这个概念大家都很熟悉,对于winform的开发人员来说,用的还是多的.但估计都是用Timer,或者backgroundWorker,为大家写了一个多线程的基类,只有你用到多线程拿过来就可以用了
    2013-12-12
  • C# XmlDocument操作XML案例详解

    C# XmlDocument操作XML案例详解

    这篇文章主要介绍了C# XmlDocument操作XML案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 在C#里面给PPT文档添加注释的实现代码

    在C#里面给PPT文档添加注释的实现代码

    平常开会或者做总结报告的时候我们通常都会用到PowerPoint演示文稿,我们可以在单个幻灯片或者全部幻灯片里面添加注释,这样观众可以从注释内容里面获取更多的相关信息,需要的朋友可以参考下
    2017-01-01
  • C#算法之两数之和

    C#算法之两数之和

    这篇文章介绍了C#算法之两数之和,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • c#实现抓取高清美女妹纸图片

    c#实现抓取高清美女妹纸图片

    本文给大家分享的是一则使用c#实现抓取网络高清美女妹纸图片的代码,这么好的东西,当然不能独享,推荐给小伙伴们。
    2015-03-03
  • C#动态调整数组大小的方法

    C#动态调整数组大小的方法

    这篇文章主要介绍了C#动态调整数组大小的方法,涉及C#中静态方法CreateInstance的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04