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 ...
随机推荐
- docker 学习资料
docker 学习资料 学习资料 网址 Docker 教程(菜鸟教程) http://www.runoob.com/docker/docker-tutorial.html
- python通过xlwt模块直接在网页上生成excel文件并下载
urls: from django.conf.urls import url, include from . import views urlpatterns = [ ... url(r'^domai ...
- 岭回归和Lasso回归以及norm1和norm2
norm代表的是距离,两个向量的距离:下图代表的就是p-norm,其实是对向量里面元素的一种运算: 最简单的距离计算(规范)是欧式距离(Euclidean distance),两点间距离是如下来算的, ...
- Eureka Client的使用
1. 新建工程 下一步,名字叫client 选择Cloud Discovery->Eureka Discovery 下一步后,点击完成 2. 在ClientApplication文件中增加Ena ...
- Excel技巧--使用规划求解
当我们需要求在有限预算下可以购买的商品数量时,我们就可以使用“规划求解”功能.如上图,在1000元的预算目标内,我们能购买左图中的各书籍多少本.而这些数量,就可以使用“规划求解”来获取答案. 1.实际 ...
- VUE简单组件通信
[x] 1.prop组件通信 1.简单理解 2.多层嵌套 [x] 2.使用ref进行组件通信 [x] 3.$emit组件通信 1.prop组件通信 1.简单理解 有点类似于应式的感觉,我不管你要不要只 ...
- Ubuntu16.04系统重装***
首先准备一个Live CD,就是Ubuntu的安装盘. 备份原理就是将系统文件压缩打包.由于Linux系统所有都是文件,故,只需要将系统打包即可.当然,必须除了当前系统运行中的文件以及临时文件. 打包 ...
- ThinkPHP 3.1.2 输出和模型使用 配置项等 - 2
一.ThinkPHP 3 的输出 (重点) a.通过 echo 等PHP原生的输出方式在页面中输出 b.通过display方法输出 想分配变量可以使用assign方法 c.修改左右定界符 休 ...
- 【Https】Spring RestTemplete支持Https安全请求
实现步骤 Step1: 自定义ClientHttpRequestFactory package com.example.demo.https; import org.springframework.h ...
- 关于java前端入门的一些简单的看法
html:是网页的骨架,静态网页初步的轮廓,简单粗糙,僵硬又没有美感.表单的标签<form>,里面的<input>很常用,里面有type属性等css:为了更加灵活,常与div一 ...