C#根据进程名称获取进程的句柄或C#如何获取其他进程的句柄?

有时候标题名是动态变化的,所以不使用FindWindow方法!

[StructLayout(LayoutKind.Sequential)]

    public struct ProcessEntry32

    {

      public uint dwSize;

      public uint cntUsage;

      public uint th32ProcessID;

      public IntPtr th32DefaultHeapID;

      public uint th32ModuleID;

      public uint cntThreads;

      public uint th32ParentProcessID;

      public int pcPriClassBase;

      public uint dwFlags;

      [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]

      public string szExeFile;

    }

    [DllImport("KERNEL32.DLL ")]

    public static extern IntPtr CreateToolhelp32Snapshot(uint flags,uint processid);

    [DllImport("KERNEL32.DLL ")]

    public static extern int CloseHandle(IntPtr handle);

    [DllImport("KERNEL32.DLL ")]

    public static extern int Process32First(IntPtr handle,ref   ProcessEntry32 pe);

    [DllImport("KERNEL32.DLL ")]

    public static extern int Process32Next(IntPtr handle,ref   ProcessEntry32 pe);

    [DllImport("User32.dll",EntryPoint="SendMessage")]

    private static extern int SendMessage(int hWnd,int Msg,int wParam,string lParam);

public IntPtr GetHandleByProcessName(string ProcessName)

    {

      List<ProcessEntry32> list=new List<ProcessEntry32>();

      IntPtr handle=CreateToolhelp32Snapshot(0x2,0);

      IntPtr hh=IntPtr.Zero;

      if((int)handle>0)

      {

        ProcessEntry32 pe32=new ProcessEntry32();

        pe32.dwSize=(uint)Marshal.SizeOf(pe32);

        int bMore=Process32First(handle,ref pe32);

        while(bMore==1)

        {

          IntPtr temp=Marshal.AllocHGlobal((int)pe32.dwSize);

          Marshal.StructureToPtr(pe32,temp,true);

          ProcessEntry32 pe=(ProcessEntry32)Marshal.PtrToStructure(temp,typeof(ProcessEntry32));

          Marshal.FreeHGlobal(temp);

          list.Add(pe);

          if(pe.szExeFile==ProcessName)

          {

            bMore=2;

            hh=GetCurrentWindowHandle(pe.th32ProcessID);

            break;

          }

          bMore=Process32Next(handle,ref pe32);

        }

      }

      return hh;

    }

    public static IntPtr GetCurrentWindowHandle(uint proid)

    {

      IntPtr ptrWnd=IntPtr.Zero;

      uint uiPid=proid;

      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.Add(uiPid,hwnd);   // 把句柄缓存起来

          SetLastError(0);    // 设置无错误

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

        }

      }

      return true;

    }

调用:

IntPtr hh=GetHandleByProcessName("notepad.exe");

      if(hh!=IntPtr.Zero)

      {

        SendMessage((int)hh,0x000C,0,"A");  //打开记事本,发送字母A

      }

C#根据进程名称获取进程的句柄?的更多相关文章

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

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

  2. 批处理:根据进程名称查询进程,如果有进程就输出up没有就输出donw

    需求:windows系统上  根据进程名称查询进程,如果有进程就输出 up ,没有就输出  donw. ::Final interpretation is owned by chenglee ::@e ...

  3. VC中遍历进程并获取进程信息

    代码如下: /***************************************************/ /* 函数: 遍历进程信息 /* 参数:进程名称 例如: aaa.exe /* ...

  4. 内核中通过进程PID获取进程的全部路径

    目录 一丶简介 二丶原理 1.原理 2.代码实现. 一丶简介 我们遇到的Dos路径.如果想转化为NT路径(也就是 C:\xxxx)类似的格式 需要自己实现. 具体原理如下: 二丶原理 1.原理 1.使 ...

  5. 通过进程名称删除进程 ps -ef

    删除进程名为udpserver的进程. kill -9 $(ps -ef|grep udpserver | grep java|awk '{print $2}' ). 1.通过进程名取得进程号: ps ...

  6. 如何查看Java进程并获取进程ID?

    1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...

  7. Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结

    Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的 ...

  8. Linux 查找指定名称的进程并显示进程详细信息

    实际应用中可能有这样的场景:给定一个进程名称特征串,查找所有匹配该进程名称的进程的详细信息. 解决的办法是: (1) 先用pgrep [str] 命令进行模糊匹配,找到匹配该特征串的进程ID: (2) ...

  9. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...

随机推荐

  1. 深入详解美团点评CAT跨语言服务监控(八)报表持久化

    周期结束 我们从消息分发章节知道,RealtimeConsumer在初始化的时候,会启动一个线程,每隔1秒钟就去从判断是否需要开启或结束一个周期(Period),如下源码,如果 value < ...

  2. Could not get lock /var/lib/dpkg/lock的解决方法

    E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to ...

  3. Javascript 中 的 for ... in 和 for ... of 差别

    Javascript 中 的 for ... in 和 for ... of 差别 for ... in 是历史问题,在循环数据时会可以出现奇怪的问题,比如把数据的属性循环出来. for ... of ...

  4. window.external的使用

    我们在js中可以通过window.external.myfunc()来调用浏览器提供的外部方法myfunc.可以让网页内的js脚本中能调用C++代码. window.external 是外部对象,如你 ...

  5. HttpServletResponse和HttpServletRequest

    1.相关的接口   HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletReq ...

  6. Mysql 通信协议抓包分析

    mysql在传输层使用的TCP协议.一个TCP payload可能有多个mysql packet.如下图所示. TCP head TCP payload (mysql packet1, mysql p ...

  7. Spring Cloud(Dalston.SR5)--Hystrix 断路器-缓存

    在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的缓存,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创建和 ...

  8. KMP(字符串匹配)算法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  9. kali 安装qq

    使用的是longene TM2013 下载地址(百度云):http://pan.baidu.com/s/1dFx8azv 安装: 64位的需要安装32位依赖文件 用这条命令 apt-get insta ...

  10. 解决“chrome adobe flash player不是最新版本”的方法

    chrome地址栏输入chrome://components 更新flash后,重启chrome即可,可能需要搭梯子才能更新.