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. 如何获取ul 中li选中的值点击button按钮跳转链接

    <ul id="parent"> <li></li> <li></li> <li></li> & ...

  2. haproxy配置监控redis主备切换(转)

    环境前提:     redis sentinel配置,三台主机,且配置运行良好        配置文件中添加: frontend ft_redis  bind 0.0.0.0:6379 name re ...

  3. 使用svnkit 的相关实例及相关问题汇总

    SVNKIT操作SVN版本库的完整例子 http://www.cnblogs.com/wangjiyuan/p/svnkitwanchenglizi.html#!comments 2.SVNClien ...

  4. 更好的自动ssh登录

    更好的自动ssh登录 解决~/.ssh/known_hosts 过期问题. bash + expect bash:ssh.sh #!/bin/bash help(){ echo "usage ...

  5. Servlet API中文版

    基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...

  6. hnnu 11546 Sum of f(x) (求一个数的全部约数和)

    代码: #include<cstdio> #include<cstring> #define N 200000 using namespace std; long long f ...

  7. 【android】禁止Edittext弹出软键盘而且使光标正常显示

    /** * 禁止Edittext弹出软件盘,光标依旧正常显示. */ public void disableShowSoftInput() { if (android.os.Build.VERSION ...

  8. git flow 的使用

     在这里主要讲一下我在项目中用到的关于gitflow的使用方法.   公司的项目中,专门有一台用来存放版本号库的server,路径是在默认的安装文件夹/opt/git/,那么在使用的时候,假设你是 ...

  9. Apache+Django+Mysql环境配置

    环境要求:Apache:2.2  Mysql:5.5 Django:1.5 python:2.7 首先下载mod_wsgi-win32-ap22py27-3.3.so 下载下来后,改名成mod_wsg ...

  10. SetCapture ReleaseCapture

    函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...