1. public class User32API
  2.  
  3. {
  4.  
  5. private static Hashtable processWnd = null;
  6.  
  7. public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);
  8.  
  9. static User32API()
  10.  
  11. {
  12.  
  13. if (processWnd == null)
  14.  
  15. {
  16.  
  17. processWnd = new Hashtable();
  18.  
  19. }
  20.  
  21. }
  22.  
  23. [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)]
  24.  
  25. public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);
  26.  
  27. [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]
  28.  
  29. public static extern IntPtr GetParent(IntPtr hWnd);
  30.  
  31. [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")]
  32.  
  33. public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);
  34.  
  35. [DllImport("user32.dll", EntryPoint = "IsWindow")]
  36.  
  37. public static extern bool IsWindow(IntPtr hWnd);
  38.  
  39. [DllImport("kernel32.dll", EntryPoint = "SetLastError")]
  40.  
  41. public static extern void SetLastError(uint dwErrCode);
  42.  
  43. public static IntPtr GetCurrentWindowHandle()
  44.  
  45. {
  46.  
  47. IntPtr ptrWnd = IntPtr.Zero;
  48.  
  49. uint uiPid = (uint)Process.GetCurrentProcess().Id; // 当前进程 ID
  50.  
  51. object objWnd = processWnd[uiPid];
  52.  
  53. if (objWnd != null)
  54.  
  55. {
  56.  
  57. ptrWnd = (IntPtr)objWnd;
  58.  
  59. if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd)) // 从缓存中获取句柄
  60.  
  61. {
  62.  
  63. return ptrWnd;
  64.  
  65. }
  66.  
  67. else
  68.  
  69. {
  70.  
  71. ptrWnd = IntPtr.Zero;
  72.  
  73. }
  74.  
  75. }
  76.  
  77. bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);
  78.  
  79. // 枚举窗口返回 false 并且没有错误号时表明获取成功
  80.  
  81. if (!bResult && Marshal.GetLastWin32Error() == )
  82.  
  83. {
  84.  
  85. objWnd = processWnd[uiPid];
  86.  
  87. if (objWnd != null)
  88.  
  89. {
  90.  
  91. ptrWnd = (IntPtr)objWnd;
  92.  
  93. }
  94.  
  95. }
  96.  
  97. return ptrWnd;
  98.  
  99. }
  100.  
  101. private static bool EnumWindowsProc(IntPtr hwnd, uint lParam)
  102.  
  103. {
  104.  
  105. uint uiPid = ;
  106.  
  107. if (GetParent(hwnd) == IntPtr.Zero)
  108.  
  109. {
  110.  
  111. GetWindowThreadProcessId(hwnd, ref uiPid);
  112.  
  113. if (uiPid == lParam) // 找到进程对应的主窗口句柄
  114.  
  115. {
  116.  
  117. processWnd[uiPid] = hwnd; // 把句柄缓存起来
  118.  
  119. SetLastError(); // 设置无错误
  120.  
  121. return false; // 返回 false 以终止枚举窗口
  122.  
  123. }
  124.  
  125. }
  126.  
  127. return true;
  128.  
  129. }
  130.  
  131. }

调用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. hdu 2689 Sort it

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2689 题目分析:求至少交换多少次可排好序,可转换为逆序对问题. 用冒泡排序较为简单,复杂度较大~~ 也 ...

  2. 汇编中PTR常见的几种用法

    汇编中PTR的用法确实是令人比较头疼的,我特意搜集了一些PTR的应用实例,可以从例子中揣摩出规律: 1.MOV    WORD PTR [DI],OFFSET BUF1 2.SUB    BYTE   ...

  3. C指针赋值

    Node* p = A; Node* f = B; Node* t; t = p; t = f 本人试图让p指向B,但这样操作是不行的.如下图:只是改变了t的指向,p并没有变

  4. 字符串转成int数组

    package lianxi; import java.awt.image.ConvolveOp; public class ZhengshuShuzu { public static void ma ...

  5. 分享:Perl打开与读取文件的方法

    在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作. Perl打开与读取文件的方法,供大家学习参考.本文转自: ...

  6. 2013-07-23 IT 要闻速记快想

    ### ========================= ###苹果的新动向今天华尔街日报称,苹果正在测试13英寸的大号iPad,以及更大屏幕的iPhone.而早在五月份,韩国资讯网站 ET New ...

  7. python 内置模块之hashlib、hmac、uuid

    一.hashlib md5和sha算法通过消息摘要算法生成定长的消息摘要,消息摘要算法是不可逆的.但同一段消息通过摘要算法后得到的值是一样的,可一通过比对消息摘要验证数据的完整性. sha算法比MD5 ...

  8. C# 刷票程序

    上个月有人让我帮忙投票,我想要不写个程序给他多刷点得了,虽然这事情有悖原则,就当娱乐了.. 先上图 1.分析 既然是网页投票,那肯定可以伪造HTTP请求来实现刷票.需要分析的就是该网站到底采用了哪些防 ...

  9. erp与电子商务集成的结构图

    集约化采购管理系统和电子商务平台统一规划.统一设计,通过系统之间的安全接口全面集成,进而实现资源共享和数据共享,企业内外部系统运作的一体化,建立企业同上.下游合作伙伴的电子数据交互,从而提高电子商务的 ...

  10. Python流程控制

    if语句: --Pyhon中的IF跟其他语言类似,if包含一个逻辑表达式,使用表达式比较,在比较的结果的基础上做出判断 --if expression: statement(s) 注意:Python使 ...