zoukankan      html  css  js  c++  java
  • C#根据进程名称获取进程的句柄?

    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
          }


  • 相关阅读:
    Struts2 HelloWorld_1
    Java Web JavaMail 邮件发送
    Struts2 ActionWildcard(通配符配置)约定优于配置
    Struts2 Action
    Struts2 struts2简介
    Struts2 ActionMethod DMI(动态方法调用)
    Java Web Servlet过滤器
    com学习笔记(2)基本的com接口QueryInterface的实现
    com学习笔记(4)动态链接
    silverlight Visifire图表转图片偷天换日的做法
  • 原文地址:https://www.cnblogs.com/xtfnpgy/p/9285415.html
Copyright © 2011-2022 走看看