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
}
C#依据进程名称获取进程的句柄?的更多相关文章
- C#根据进程名称获取进程的句柄?
C#根据进程名称获取进程的句柄或C#如何获取其他进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] ...
- 批处理:根据进程名称查询进程,如果有进程就输出up没有就输出donw
需求:windows系统上 根据进程名称查询进程,如果有进程就输出 up ,没有就输出 donw. ::Final interpretation is owned by chenglee ::@e ...
- VC中遍历进程并获取进程信息
代码如下: /***************************************************/ /* 函数: 遍历进程信息 /* 参数:进程名称 例如: aaa.exe /* ...
- 内核中通过进程PID获取进程的全部路径
目录 一丶简介 二丶原理 1.原理 2.代码实现. 一丶简介 我们遇到的Dos路径.如果想转化为NT路径(也就是 C:\xxxx)类似的格式 需要自己实现. 具体原理如下: 二丶原理 1.原理 1.使 ...
- 通过进程名称删除进程 ps -ef
删除进程名为udpserver的进程. kill -9 $(ps -ef|grep udpserver | grep java|awk '{print $2}' ). 1.通过进程名取得进程号: ps ...
- 如何查看Java进程并获取进程ID?
1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
Atitit,通过pid获取进程文件路径 java php c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的 ...
- Linux 查找指定名称的进程并显示进程详细信息
实际应用中可能有这样的场景:给定一个进程名称特征串,查找所有匹配该进程名称的进程的详细信息. 解决的办法是: (1) 先用pgrep [str] 命令进行模糊匹配,找到匹配该特征串的进程ID: (2) ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
随机推荐
- go iota
package main import ( "fmt" ) const ( a = 'A' b c = iota d ) func main() { fmt.Println(a) ...
- git for windows (又名 msysgit)如何记住用户名和密码
创建存储用户名密码的文件 在home文件夹,一般是 C:\Documents and Settings\Administrator 下建立文件 .git-credentials (windows下不允 ...
- Delphi基础Write写入结构体到文件(使用 file of myrecord就行了,真简单)
program WriteStruct; {$APPTYPE CONSOLE} uses SysUtils; //写入结构体 type TCustomer = record ID: ]; Code: ...
- 关于智普 - 千人免费学|Python培训|国内最权威python培训|html5
关于智普 - 千人免费学|Python培训|国内最权威python培训|html5 智普教育隶属于北京顶嵌开源科技有限公司,成立于2008年. 智普开源是基于Linux系统的互联网开源学习平台,讲求务 ...
- Android 异步链式调用设计
本文讨论一下异步链式调用的设计与实现. 考虑如下情况: 情况1: 访问网络(或其他耗时的事情).通常的做法是: 1.显示一个ProgressDialog对话框,提示用户. 2.启动工作线程来执行耗时操 ...
- scala 函数编程
scala 函数编程 Effective Scala.pdf: http://www.t00y.com/file/76767869 Functional_Programming_in_Scal ...
- AIX下RAC搭建 Oracle10G(四)安装CRS
AIX下RAC搭建系列 AIX下RAC搭建Oracle10G(四)安装CRS 环境 节点 节点1 节点2 小机型号 IBM P-series 630 IBM P-series 630 主机名 AIX2 ...
- BroadcastReceiver总结
一.工程整体图 二.activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...
- 在ireport中使用checkbox
在网上搜索了很多实现checkbox的办法, 主要是利用打钩图片实现. 下面是我的做法,也不怎么高明, 不过比利用图片好. 后台 map.put("lifeTimePartFlag" ...
- selenium + firefox/chrome/phantomjs登陆之模拟点击
登陆之模拟点击 工具:python/java + selenium + firefox/chrome/phantomjs (1)windows开发环境搭建 默认已经安装好了firefox 安装pip ...