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() == )

        {

            objWnd = processWnd[uiPid];

            if (objWnd != null)

            {

                ptrWnd = (IntPtr)objWnd;

            }

        }

        return ptrWnd;

    }

    private static bool EnumWindowsProc(IntPtr hwnd, uint lParam)

    {

        uint uiPid = ;

        if (GetParent(hwnd) == IntPtr.Zero)

        {

            GetWindowThreadProcessId(hwnd, ref uiPid);

            if (uiPid == lParam)    // 找到进程对应的主窗口句柄

            {

                processWnd[uiPid] = hwnd;   // 把句柄缓存起来

                SetLastError();    // 设置无错误

                return false;   // 返回 false 以终止枚举窗口

            }

        }

        return true;

    }

}

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

http://www.cnblogs.com/qiuyi21/articles/1302732.html

[转载]C#获取进程的主窗口句柄的更多相关文章

  1. C#获取进程的主窗口句柄的实现方法

    通过调用Win32 API实现. public class User32API { private static Hashtable processWnd = null; public delegat ...

  2. Delphi 通得进程ID获取主窗口句柄

    只知道进程ID,获取主窗口句柄的方法如下: 通过EnumWindows枚举所有窗口 使用GetWindowThreadProcessID,通过窗口句柄获取进程ID 比便获取的进程ID与当前已知的进程I ...

  3. C# 获取进程或线程的相关信息

    信息来自: http://blog.163.com/kunkun0921@126/blog/static/169204332201293023432113/ using System; using S ...

  4. C#根据进程名称获取进程的句柄?

    C#根据进程名称获取进程的句柄或C#如何获取其他进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] ...

  5. Bash Shell 获取进程 PID

    转载地址:http://weyo.me/pages/techs/linux-get-pid/ 导读 Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运 ...

  6. CMD魔法堂:获取进程路径和PID值的方法集

    一.前言    在开发发布更更新工具——更新Weblogic应用模块时,了解到更新Weblogic应用需要先关闭Weblogic应用窗口然后是清缓存.更新应用文件,最后再重启Weblogic应用窗口. ...

  7. C++获取进程号及窗口

    #include <TlHelp32.h> //根据进程名获取进程ID BOOL GetPidByProcessName(TCHAR *pProcess, DWORD*dwPid) { H ...

  8. 写一个Windows上的守护进程(8)获取进程路径

    写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...

  9. C#依据进程名称获取进程的句柄?

    C#依据进程名称获取进程的句柄或C#怎样获取其它进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] ...

随机推荐

  1. Cocos2d-JS中的Sprite精灵类

    精灵类是cc.Sprite,它的类图如下图所示.cc.Sprite类直接继承了cc.Node类,具有cc.Node基本特征. 创建Sprite精灵对象 创建精灵对象可以使用构造函数实现,它们接受相同的 ...

  2. UI1_UITabBarController

    // // AppDelegate.h // UI1_UITabBarController // // Created by zhangxueming on 15/7/8. // Copyright ...

  3. DFS入门之二---DFS求连通块

    用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...

  4. EF调用存储过程

    var objPar1 = new System.Data.Objects.ObjectParameter("ExeResults",typeof(bool)); var objP ...

  5. daxuez.com

    大学z,一个还没想好的名字和项目 初期定位:服务于武汉各大高校的大学学生群体 服务项目:兼职.旅游.培训.租车.班服订做.票务

  6. Javascript原型链

    原型链的关系 在Javascript中,只要创建了一个新函数,就会为该函数创建prototype属性,指向函数的原型对象,Object.prototype是所有对象最顶层的原型.所有对象都继承由Obj ...

  7. 第一行代码 Android 第二版到货啦

    今日android第一行代码[第二版]已到,收获的季节到了 先看一下封面 书签: 以后就把空闲时间送给它吧 先来看一下本书的目录: 第1章 开始启程--你的第1行Android代码 第2章 先从看得到 ...

  8. .NET SOCKET通信编程

    1 using System; 2 using System.Net; 3 using System.Net.Sockets; 4 using System.Text; 5 6 public clas ...

  9. WPF-控件-将ListBox条目水平排列

    <Grid Margin="6"> <ListBox> <!--ItemsPanel--> <ListBox.ItemsPanel> ...

  10. openwrt无线中继教程

    1.设置自己路由lan口的IP地址,网段不能跟上级路由的一样. 2.在无线标签下点击"扫描网络". 3.在新出现的界面中,会列出你附近的无线网络.点击你需要中继的网络右边的&quo ...