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. Floodlight 处理交换机增加/移除过程

         Floodlight 使用的是Netty架构,在Controller.java 入口函数中显示创建ServerBootstrap,设置套接字选项,ChannelPipeline,此时监听套接 ...

  2. OpenJDK1.8.0 源码解析————HashMap的实现(一)

    HashMap是Java Collection Framework 的重要成员之一.HashMap是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,映射是以键值对的形式映射:key-v ...

  3. Delphi结构中使用String时遇到的内存泄露问题(没有利用String的引用计数自动销毁字符串的功能)

    先定义一个结构: TUserInfo = record  UserID: Integer; // 用户编号  UserName: string; // 用户名end; 然后编写如下代码: proced ...

  4. [Android学习笔记]捕获物理回退事件

    物理回退按钮默认情况下是finish当前activity,返回上一个activity 当需要获取物理回退按钮的相应事件时候,可以这么做 步骤如下: 1.override当前activity的onKey ...

  5. Lu核心库系统结构及输出函数

    Lu核心库系统结构及输出函数 Lu来源于Forcal,可以说,没有Forcal就没有Lu,但学习Lu并不需要了解Forcal. Lu是对Forcal的完善和发展,但与Forcal相比,Lu更简洁实用. ...

  6. 算法起步之Dijkstra算法

    原文:算法起步之Dijkstra算法 友情提示:转载请注明出处[作者 idlear    博客:http://blog.csdn.net/idlear/article/details/19687579 ...

  7. Android开源项目大全 - 工具类

    主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...

  8. oschina Web应用开发

    Web应用开发 SPDY开发包(13) HTML5开发相关(105) Pjax相关项目(4) 网站API(93) REST/RESTful项目(72) 响应式 Web 框架(27) 微信相关软件(63 ...

  9. Android拖动和缩放图片

    Android拖动和缩放图片 2014年5月9日 我们在使用应用其中常常须要浏览图片.比方在微信其中.点击图片之后能够对图片进行缩放. 本博客介绍怎样对图片进行拖拽和缩放.这首先要了解Android中 ...

  10. SWT中的多线程(Invalid thread access)

    最近在学习swt的东西,遇到一个问题,特转录如下. SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线 ...