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

}

时间: 2024-10-10 21:01:36

C#依据进程名称获取进程的句柄?的相关文章

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

根据进程名称获取进程id

# -*- conding:utf-8-*- import subprocess def getpid_windows(process_name):    """利用cmd_str = tasklist|find /i "xdict.exe" 来查找windows平台的进程id"""    cmd_line = 'tasklist|find /i "%s"' %process_name    pp = su

根据进程ID获取进程路径

根据进程ID获取进程路径有两种方法:方法1:OpenProcess --> GetModuleFileNameEx方法2:OpenProcess --> EnumProcessModules --> GetModuleFileNameEx 注意事项:1.使用GetModuleFileNameEx()而不是GetModuleFileName()2.GetModuleFileNameEx()指定的hProcess需要PROCESS_QUERY_INFORMATION | PROCESS_VM

批处理:根据进程名称查询进程,如果有进程就输出up没有就输出donw

需求:windows系统上  根据进程名称查询进程,如果有进程就输出 up ,没有就输出  donw. ::Final interpretation is owned by chenglee ::@echo off<nul 3>nul @echo off&title Checking For SystemProcess, Thankyou... :2 color 0E wmic process get name | findStr /i "chat*" ::if n

VC中遍历进程并获取进程信息

代码如下: /***************************************************/ /* 函数: 遍历进程信息 /* 参数:进程名称 例如: aaa.exe /* 返回: 无 /* 创建人: 日期 内容 /* 金胖胖 2015年2月26日 新建 /***************************************************/ void CUIConsoleDlg::GetAllProcessInfo(char* szExeFile)

Python写自动化之启动进程并获取进程输出

当我们需要执行外部命令或自己写一个自动化执行器时,需要使用到启动进程并获取输出的操作 首先,我们启动进程采用Python的subprocess模块,为了保证标准输出和标准错误输出能够正常运行,启动两个线程来检测输出结果部分 class Daemon(threading.Thread): def __init__(self, workDir, logFunction=None, *args): threading.Thread.__init__(self) self.process = None

如何查看Java进程并获取进程ID?

1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps 命令用于查看当前正在运行的进程.grep 是搜索例如: ps -ef | grep java表示查看所有进程里 CMD 是 java 的进程信息ps -aux | grep java-aux 显示所有状态ps3. kill 命令用于终止进程例如: kill -9 [PID]-9 表示强迫进程立即停

windows-根据进程PID 获取进程路径

代码: C++ #include <windows.h> #include <Psapi.h> #pragma comment(lib,"psapi.lib") void GetPathByProcessId(DWORD dwPid) { //使用PROCESS_ALL_ACCESS 需要提权这里我直接扣出来的.提权代码看另一篇. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid); if

Atitit,通过pid获取进程文件路径&#160;java&#160;php&#160;&#160;c#.net版本大总结

Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的路径最常用的方法是通过GetModuleFileNameEx函数获得可执行文件的模块路径这个函数从Windows NT 4.0开始到现在的Vista系统都能使用,向后兼容性比较好.2 1.2. 第二种方法是GetProcessImageFileName函数,这个函数在Windows XP及其以后的系