进程句柄获取
- 格式:doc
- 大小:40.00 KB
- 文档页数:5
python使用进程获取句柄的方法在Python中,可以使用进程(Process)来执行并发任务。
获取句柄(handle)是一种常见的操作,它允许我们对操作系统资源进行操作。
在Python中,获取句柄的方法可以通过使用`multiprocessing`模块来实现。
首先,我们需要导入`multiprocessing`模块:```pythonimport multiprocessing```接下来,我们可以使用`multiprocessing.Process`类来创建一个新的进程。
通过调用`Process`类的构造函数,并传递一个函数作为参数,我们可以定义在新进程中需要执行的任务。
```pythondef my_task():# 任务逻辑passprocess = multiprocessing.Process(target=my_task)```在上面的示例中,我们创建了一个名为`my_task`的函数,并通过`target`参数将其传递给`Process`类的构造函数。
这将告诉Python在新进程中执行`my_task`函数。
要启动进程,我们需要调用进程对象的`start`方法:```pythonprocess.start()```一旦进程开始执行,我们可以通过`Process`对象的`pid`属性获得进程的ID:```pythonprint("进程ID:", process.pid)```此外,如果我们希望等待进程执行完毕,可以使用`Process`对象的`join`方法:```pythonprocess.join()````join`方法会阻塞当前进程,直到被调用的进程运行结束。
在使用`Process`类创建的进程中,我们可以使用操作系统提供的进程相关的API来获取句柄。
但是需要注意的是,由于Python的GIL限制,只有调用Python 标准库中的函数时,才能在不同的进程之间共享句柄。
易语⾔通过进程名获取指定进程的句柄!学习价值⾼今天我们要给⼤家带来的⼲货是!利⽤易语⾔枚举指定的进程名,并获取指定进程的句柄号!是不是很想学呢?其实这样的教程⽹上有很多,但是⼩编觉得,⽹上的⼤部分此类教程都是调⽤⼀些DLL⽂件的API实现的,没有任何的学习价值,对于新⼿来说作⽤不⼤,最好是直接通过原⽣的代码能开发是最好的对吧,废话不多说直接操作。
需要的⼯具:1、易语⾔2、精易模块V8开发原理图:其实我们下⾯要实现的功能原理⼤概像上图⼀样,我建议你先看下这个原理图,再继续往下看,这样的话好理解⼀下。
操作步骤:1、我们打卡易语⾔,然后设计⼀下软件的整体框架,尽管很难看。
那么具体的操作原理和步骤去我们也是从哪⾥转载过来的!源码应该也是在哪⾥可以下载到的。
2、点击枚举此进程,然后写⼊如下代码,代码功能是获取系统所以的进程列表,然后枚举编辑框内指定的进程名。
3、最后我们来⼀下结束指定进程的命令。
整个程序的源代码:窗⼝程序集名保留保留备注窗⼝程序集_启动窗⼝⼦程序名返回值类型公开备注_按钮1_被单击变量名类型静态数组备注进程列表进程信息0i整数型进程列表=取系统进程列表 ()计次循环⾸ (取数组成员数 (进程列表), i)判断 (进程列表 [i].进程名称=编辑框1.内容)编辑框2.内容=到⽂本 (进程列表 [i].进程标识符)i = 0计次循环尾 ()⼦程序名返回值类型公开备注_按钮2_被单击进程_结束 (到整数 (编辑框2.内容))i⽀持库列表⽀持库注释eAPI应⽤接⼝⽀持库最后咋们看下程序的运⾏效果!当我们点击枚举按钮后,果然在另⼀个编辑框出现了此进程的句柄号。
有了句柄号,我们就可以通过⼀系列的名称去操作句柄所对应的窗⼝程度了!⾃⼰脑补哈。
python 进程pid获取后台hwnd的方法-回复如何通过Python获取后台窗口的句柄(HWND)?在一些需要与操作系统交互的场景中,我们可能需要获取到后台窗口的句柄(HWND)。
HWND 是Windows 下的一个重要概念,它代表了一个窗口的句柄。
通过HWND,我们可以操纵窗口,进行诸如最小化、最大化、关闭等操作。
在本文中,我们将使用Python 语言,介绍一种获取后台窗口句柄的方法。
具体来说,我们将探讨如何通过进程的PID (进程标识符)来获取窗口的句柄。
我们将分为以下几个步骤来完成这个任务:1. 导入所需的模块2. 获取进程列表3. 遍历进程列表,找到目标进程的PID4. 根据PID 获取窗口句柄接下来,让我们一步一步来完成这些步骤。
第一步:导入所需的模块在开始之前,我们需要先导入一些Python 模块。
我们将使用`psutil` 和`pygetwindow` 这两个模块来实现对进程和窗口的操作。
pythonimport psutilimport pygetwindow as gw`psutil` 是一个跨平台的进程和系统监控库,我们可以使用它来获取进程相关信息。
`pygetwindow` 是一个用于控制和获取窗口相关信息的库。
第二步:获取进程列表我们需要获取系统中所有正在运行的进程的列表。
可以通过使用`psutil` 模块的`process_iter` 函数来实现。
该函数将返回一个可迭代对象,我们可以遍历它来获取每个进程的信息。
pythonprocesses = list(psutil.process_iter())上述代码将获取到一个包含所有进程的列表。
第三步:遍历进程列表,找到目标进程的PID我们需要遍历进程列表,找到目标进程的PID。
在这个例子中,我们将以Notepad++ 编辑器为例,以获取其窗口句柄。
pythontarget_process_name = "notepad++.exe"desired_pid = Nonefor process in processes:if () == target_process_name:desired_pid = process.pidbreak在上述代码中,我们使用`name()` 方法来获取进程的名称,然后与目标进程的名称进行比较。
cheat engine 句柄
获取游戏进程的句柄可以让Cheat Engine直接访问游戏内存,
并进行修改。
这通常涉及到在Cheat Engine中打开游戏进程,然后
通过特定的方法获取该进程的句柄。
一旦获得了句柄,就可以使用Cheat Engine进行各种修改,比如修改游戏中的金钱、生命值等。
然而,需要注意的是,使用Cheat Engine进行游戏作弊可能违
反游戏的使用条款,甚至触犯法律。
此外,一些在线游戏可能会有
反作弊机制,会检测到Cheat Engine的运行并采取相应的措施。
因此,在使用Cheat Engine时,务必谨慎并遵守相关法律法规和游戏
规定。
总的来说,Cheat Engine和句柄之间的关系在于通过获取游戏
进程的句柄,Cheat Engine可以对游戏内存进行修改。
然而,使用Cheat Engine进行游戏作弊可能存在法律和道德上的问题,使用时
需要谨慎对待。
希望这些信息能够回答你关于“cheat engine 句柄”的问题。
VC++ 通过进程名或进程ID获取进程句柄HANDLE GetProcessHandle(int nID)//通过进程ID获取进程句柄{return OpenProcess(PROCESS_ALL_ACCESS,FALSE,nID);}HANDLE GetProcessHandle(LPCTSTR pName)//通过进程名获取进程句柄{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (INVALID_HANDLE_VALUE == hSnapshot) {return NULL;}PROCESSENTRY32 pe = {sizeof(pe) };BOOL fOk;for (fOk = Process32First(hSnapshot,&pe); fOk;fOk = Process32Next(hSnapshot,&pe)) {if (!_tcscmp(pe。
szExeFile,pName)) {CloseHandle(hSnapshot);return GetProcessHandle(pe.th32ProcessID);}}return NULL;}VC由进程ID获取窗口句柄HWND GetWindowHandleByPID(DWORD dwProcessID){HWND h = GetTopWindow(0);while (h ){DWORD pid = 0;DWORD dwTheardId = GetWindowThreadProcessId( h,&pid);if (dwTheardId != 0){if (pid == dwProcessID/*your process id*/ ){// here h is the handle to the windowreturn h;}}h = GetNextWindow(h ,GW_HWNDNEXT);}return NULL;}HWND GetHwndByPid(DWORD ProcessId)//进程ID取窗口句柄{WINDOWINFO WinInfo1[255];HWND _hwnd=0;DWORD aa=EnumWindowInfo(WinInfo1);for(int i=0;i〈aa;i++){if (WinInfo1[i].dwProcessId==ProcessId){_hwnd=WinInfo1[i].hwnd1;if (0 ==::GetWindowLong(WinInfo1[i].hwnd1,GWL_HWNDPARENT)){return WinInfo1[i]。
python 进程pid获取hwnd的方法Python 是一种功能强大的编程语言,可以用来开发各种应用程序,包括与操作系统进程进行交互。
获取进程的PID(进程ID)是一项常见的任务,并且在某些情况下,我们可能还需要获取进程的窗口句柄(HWND)来进行更进一步的操作。
在 Python 中,我们可以使用 `pygetwindow` 模块来获取指定进程的 HWND。
以下是获取进程 PID 并获取其 HWND 的示例代码:```pythonimport pygetwindow as gwimport win32process# 获取进程PIDdef get_process_pid(process_name):for process in gw.getAllTitles():if process_name.lower() in process.lower():hwnd = gw.getWindowsWithTitle(process)if hwnd:return hwnd[0].hwndreturn None# 获取进程HWNDdef get_process_hwnd(process_pid):try:process_handle =win32process.OpenProcess(win32process.PROCESS_ALL_ACCESS, False, process_pid) hwnd = win32process.GetProcessWindowStation()return hwndexcept Exception as e:print(f"获取进程HWND失败: {e}")return None# 设置待查找的进程名称target_process_name = "example.exe"# 获取进程PIDpid = get_process_pid(target_process_name)if pid:print(f"目标进程 {target_process_name} 的PID为: {pid}")# 获取进程HWNDhwnd = get_process_hwnd(pid)if hwnd:print(f"目标进程 {target_process_name} 的HWND为: {hwnd}")else:print(f"未找到进程 {target_process_name} 的HWND")else:print(f"未找到进程 {target_process_name} 的PID")```首先,我们使用 `pygetwindow` 模块的 `getAllTitles` 函数来获取所有当前正在运行的进程标题。
Visual Studio 句柄1. 什么是 Visual Studio 句柄Visual Studio 句柄是指在使用 Visual Studio 开发环境下,对于窗口、控件等资源所分配的唯一标识符。
这个标识符可以用来指示和操作相应的资源。
2. Visual Studio 句柄的种类在 Visual Studio 中,存在多种类型的句柄,下面列举了几种常见的句柄类型:2.1 窗口句柄(HWND)窗口句柄(HWND,全称为 Handle to Window)是 Visual Studio 窗口系统中对窗口的唯一标识符。
每个窗口都有一个唯一的窗口句柄,可以通过窗口句柄来获取和操作窗口的各种属性。
2.2 控件句柄(HWND)控件句柄(HWND)是 Visual Studio 中对控件(例如按钮、文本框等)的唯一标识符。
通过控件句柄,我们可以获取和操作控件的各种属性和行为。
2.3 文件句柄(HANDLE)文件句柄(HANDLE)用于标识打开的文件。
在 Visual Studio 中,我们可以用文件句柄来读取、写入和关闭文件等操作。
2.4 进程句柄(HANDLE)进程句柄(HANDLE)用于标识正在运行的进程。
通过进程句柄,我们可以获取和控制进程的各种属性和行为。
3. Visual Studio 句柄的使用方法在 Visual Studio 中,我们可以使用一些 API 函数来获取和操作句柄,下面介绍几种常见的用法:3.1 获取窗口句柄获取窗口句柄的方法有多种,常见的方法之一是使用 FindWindow 函数。
这个函数可以按照窗口的类名和窗口标题来查找对应的窗口句柄。
HWND hWnd = FindWindow(NULL, _T("Visual Studio"));3.2 获取控件句柄获取控件句柄的方法通常是通过窗口句柄和控件的类名、标识符等属性来获取。
通过 GetDlgItem 函数可以根据窗口句柄和控件 ID 来获取相应的控件句柄。
vb获取句柄的几种方式获取句柄是在VB中常见的操作之一,句柄可以用于标识和操作窗口、控制界面元素等。
下面将介绍几种常见的获取句柄的方式。
1. 使用FindWindow函数FindWindow函数可以根据窗口类名和窗口标题来查找窗口句柄。
可以使用以下代码获取窗口句柄:```vbDim hwnd As Longhwnd = FindWindow("窗口类名", "窗口标题")```其中,窗口类名是指窗口所属的类的名称,窗口标题是窗口上显示的文本。
2. 使用FindWindowEx函数FindWindowEx函数可以在指定窗口下查找符合条件的子窗口句柄。
可以使用以下代码获取子窗口句柄:```vbDim hwndParent As LongDim hwndChild As LonghwndParent = FindWindow("父窗口类名", "父窗口标题") hwndChild = FindWindowEx(hwndParent, 0, "子窗口类名", "子窗口标题")```其中,hwndParent是父窗口的句柄,hwndChild是子窗口的句柄。
3. 使用GetForegroundWindow函数GetForegroundWindow函数可以获取当前活动窗口的句柄。
可以使用以下代码获取当前活动窗口句柄:```vbDim hwnd As Longhwnd = GetForegroundWindow()```该函数不需要任何参数,直接调用即可。
4. 使用GetDesktopWindow函数GetDesktopWindow函数可以获取桌面窗口的句柄。
可以使用以下代码获取桌面窗口句柄:```vbDim hwnd As Longhwnd = GetDesktopWindow()```该函数不需要任何参数,直接调用即可。
获取进程句柄的方法获取进程句柄是在编程过程中常常需要的操作之一,可以通过不同的方法来实现。
下面列举了十种获取进程句柄的方法:1. 使用Windows API函数OpenProcess来获取进程句柄。
OpenProcess函数是Windows提供的一个用于打开进程的函数,可以通过指定进程ID或进程名称来获取进程句柄。
2. 使用Windows API函数GetCurrentProcess来获取当前进程的句柄。
GetCurrentProcess函数是Windows提供的一个用于获取当前进程句柄的函数,可以直接调用该函数获取当前进程的句柄。
3. 使用Windows API函数CreateToolhelp32Snapshot和Process32First/Process32Next来获取进程句柄。
这种方法是通过遍历系统中所有进程的方式来获取进程句柄,可以通过指定进程ID 或进程名称来筛选需要的进程。
4. 使用Windows API函数EnumProcesses来获取所有进程的ID,然后再使用OpenProcess函数来获取进程句柄。
这种方法是通过遍历系统中所有进程的方式来获取进程句柄,可以获取系统中所有进程的句柄。
5. 使用Windows API函数QueryFullProcessImageName来获取进程的完整路径,然后再使用OpenProcess函数来获取进程句柄。
QueryFullProcessImageName函数是Windows提供的一个用于获取进程完整路径的函数,可以通过指定进程ID或进程句柄来获取进程的完整路径。
6. 使用Windows API函数GetWindowThreadProcessId来获取窗口所属进程的ID,然后再使用OpenProcess函数来获取进程句柄。
GetWindowThreadProcessId函数是Windows提供的一个用于获取窗口所属进程ID的函数,可以通过指定窗口句柄来获取窗口所属进程的ID。
C#获取进程的主窗⼝句柄的实现⽅法通过调⽤Win32 API实现。
复制代码代码如下:public class User32API{private static Hashtable processWnd = null;public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);static User32API(){if (processWnd == null){processWnd = new Hashtable();}}[DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)]public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);[DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]public static extern IntPtr GetParent(IntPtr hWnd);[DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")]public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);[DllImport("user32.dll", EntryPoint = "IsWindow")]public static extern bool IsWindow(IntPtr hWnd);[DllImport("kernel32.dll", EntryPoint = "SetLastError")]public static extern void SetLastError(uint dwErrCode);public static IntPtr GetCurrentWindowHandle(){IntPtr ptrWnd = IntPtr.Zero;uint uiPid = (uint)Process.GetCurrentProcess().Id; // 当前进程 IDobject 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[uiPid] = hwnd; // 把句柄缓存起来SetLastError(0); // 设置⽆错误return false; // 返回 false 以终⽌枚举窗⼝}}return true;}}调⽤User32API.GetCurrentWindowHandle()即可返回当前进程的主窗⼝句柄,如果获取失败则返回IntPtr.Zero。
如何通过句柄获取外部程序的窗口的内容要通过句柄获取外部程序的窗口内容,可以使用Windows API函数来实现。
具体步骤如下:
1. 使用Windows API函数`FindWindow`或`FindWindowEx`来查找目标窗口的句柄。
`FindWindow`可以根据窗口类名或窗口标题查找句柄,`FindWindowEx`可以根据父窗口句柄和窗口类名查找句柄。
如果获取到了目标窗口的句柄,继续下一步;否则,表示未找到目标窗口。
2. 使用Windows API函数`GetWindowTextLength`和
`GetWindowText`来获取目标窗口的文本内容。
`GetWindowTextLength`用于获取文本内容的长度,`GetWindowText`用于获取实际文本内容。
可以先使用`GetWindowTextLength`来获取文本长度,然后创建一个对应长度的缓冲区,再使用`GetWindowText`来获取文本内容。
3. 可以使用其他Windows API函数来获取窗口的其他信息,如
`GetClassName`获取窗口的类名,`GetWindowRect`获取窗口的位置和大小等。
需要注意的是,使用Windows API函数需要导入`user32.dll`库,并且可以使用C++、C#、Python等编程语言进行开发。
使用不同编程语言,具体API函数的调用方式会有所差异。
python win32api 操作句柄Win32 API是一种用于在Windows操作系统上进行编程的应用程序接口。
它提供了一组函数和常量,开发人员可以使用这些函数和常量来访问操作系统的功能。
其中,win32api模块是Python中用于操作句柄的一个重要模块。
句柄是一种数据结构,用于标识操作系统中的各种资源,例如窗口、文件、进程等。
通过win32api模块,开发人员可以获取、创建、操作和关闭句柄,实现对各种资源的控制和管理。
下面将列举10个使用win32api操作句柄的例子。
1. 获取窗口句柄:可以使用win32api的FindWindow函数获取指定窗口标题的句柄。
例如,可以通过以下代码获取记事本窗口的句柄:```pythonimport win32guihwnd = win32gui.FindWindow(None, "记事本")```2. 关闭窗口:可以使用win32api的PostMessage函数向指定窗口发送关闭消息,实现关闭窗口的功能。
例如,可以通过以下代码关闭记事本窗口:```pythonimport win32api, win32conwin32api.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)```3. 获取进程句柄:可以使用win32api的OpenProcess函数获取指定进程的句柄。
例如,可以通过以下代码获取记事本进程的句柄:```pythonimport win32api, win32con, win32processpid = win32process.GetWindowThreadProcessId(hwnd)[1] hProcess = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid)```4. 读取进程内存:可以使用win32api的ReadProcessMemory函数读取指定进程的内存数据。
根据进程名获取窗口句柄这个是百度上有朋友提问的,因为本人之前做过类似研究,所以给出了满意答案。
但看到该问题前边数位高手的回答就会明白,这并非一个简单的问题。
因为他们众口一致地说:这是不可能实现的!不幸让我实现了。
之所以很多人说不可能实现,是因为根据进程名确实无法从正面推出窗口句柄,因为进程启动后,OS加载其窗体并为其各个窗口分配句柄,窗口所得句柄是不确定的。
但是作为聪明人,我们不能在一棵二叉树上吊死是吧!反过来思考,我们知道根据窗口句柄可以推出进程名,所以我们可以从OS的所有已分配的窗口句柄入手,逐个分析直到匹配到指定进程名,句柄不就出来了吗。
思路就是枚举窗口,枚举进程,对各个窗口进行分析,与目标进程名对比,直到找到为止;多个进程实例的可修改回调函数。
‘代码如下'一模块,一窗体,一文本框(用于输入进程名),一列表框(用于显示所有标题),一命令按钮(开始)'模块部分Public Declare Function EnumWindows Lib "user32" _(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long'枚举窗口Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long '获取窗口标题Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _(ByVal hWnd As Long) As Long'获取窗口标题长度Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As LongPublic Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As LongPublic Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As LongPublic Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As LongPublic Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Long) As LongPublic Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As LongPublic Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPublic Type PROCESSENTRY32dwSize As LongcntUsage As Longth32ProcessID As Longth32DefaultHeapID As Longth32ModuleID As LongcntThreads As Longth32ParentProcessID As LongpcPriClassBase As LongdwFlags As LongszExeFile As String * 1024End TypePublic hwn As Long, SSS As StringPublic Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Long '回调函数Dim sSave As String, Ret As Long, windowProcessId As LongRet = GetWindowTextLength(hWnd)sSave = Space(Ret)GetWindowText hWnd, sSave, Ret + 1GetWindowThreadProcessId hWnd, windowProcessIdIf windowProcessId = Form1.pid ThenIf IsWindowEnabled(hWnd) = 1 Thenhwn = hWndSSS = SSS & hWnd & "|" '存储所有相关句柄进字符串sss End IfEnd IfEnumWindowsProc = 2End FunctionPublic Sub draw()EnumWindows AddressOf EnumWindowsProc, ByVal 0&End Sub'窗体部分Const TH32CS_SNAPHEAPLIST = &H1Const TH32CS_SNAPPROCESS = &H2Const TH32CS_SNAPTHREAD = &H4Const TH32CS_SNAPMODULE = &H8Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)Const TH32CS_INHERIT = &H80000000Public pid As LongDim pname As StringDim a As String, hw As Long'原创函数,返回字符串中字串个数Function lon(st As String, sr As String) As LongDim f As Long, g As LongFor f = 1 To Len(st)If Mid(st, f, Len(sr)) = sr Then g = g + 1lon = gNext fEnd Function'原创函数:返回字符串中第几段字符。
【API】每日学一个API之GetParent、GetWindowThreadProcessId-根据进程标识符(PID)获得对应的句柄2010年02月15日星期一 09:27咳咳、、号外:昨天有位同学要求获得指定窗口的状态、这个我暂时无解、正在想曲线救国的方法、、好了、回到今天的内容、对于PID大家一定都不陌生、在任务管理器中查看、如果打开没有、则选择查看——选择列、、至于PID是个什么东西、建议百度、、今天的内容和当时说findwindow是一样的、没有任何意义、以后配合使用、今天这里已经多了两个新的API了、所以不加其他内容了、看例子:Option ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As LongPrivate Const GW_HWNDNEXT = 2Function InstanceToWnd(ByVal target_pid As Long) As LongDim test_hwnd As Long, test_pid As Long, test_thread_id As Long test_hwnd = FindWindow(ByVal 0&, ByVal 0&)Do While test_hwnd <> 0If GetParent(test_hwnd) = 0 Thentest_thread_id = GetWindowThreadProcessId(test_hwnd,test_pid)If test_pid = target_pid ThenInstanceToWnd = test_hwndExit DoEnd IfEnd Iftest_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)LoopEnd FunctionPrivate Sub Form_Load()Dim Pid As LongPid = Shell("c:\windows\notepad.exe", vbNormalFocus) '获得记事本的PID'今天终于用到这个PID了、、、激动If Pid = 0 Then MsgBox "Error starting the app"MsgBox "运行程序的PID:" & Pid & vbCrLf & "对应的句柄为:" & InstanceToWnd(Pid)End Sub'相关信息'FindWindow'略'-----------------------'GetParent'说明'判断指定窗口的父窗口'返回值'Long,父窗口的句柄。
以前用输入法注入的时候需要用到的代码,写的还不错,分享一下吧,顺便当个备用view sourceprint?01 //根据进程名获取进程ID02 DWORD GetPidByProcessName(TCHAR * pProcess)03 {04 HANDLE hSnapshot;05 PROCESSENTRY32 lppe;06 //创建系统快照07 hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); //#include<Tlhelp32.h>08 if (hSnapshot == NULL)09 return 0;10 //初始化 lppe 的大小11 lppe.dwSize = sizeof (lppe);12 //查找第一个进程13 if (!::Process32First(hSnapshot, &lppe))14 return false ;15 do16 {17 if(StrCmp(lppe.szExeFile, pProcess) == 0)//#include<shlwapi.h>18 {19 return lppe.th32ProcessID;20 }21 }22 while (::Process32Next(hSnapshot, &lppe)); //查找下一个进程2324 return 1;25 }2627 //根据进程ID获取窗口句柄28 HWND GetHwndByPid(DWORD dwProcessID)29 {30 //返回Z序顶部的窗口句柄31 HWND hWnd = ::GetTopWindow(0);32 while ( hWnd )33 {34 DWORD pid = 0;35 //根据窗口句柄获取进程ID36 DWORD dwTheardId = ::GetWindowThreadProcessId( hWnd,&pid);3738 if (dwTheardId != 0)39 {40 if ( pid == dwProcessID )41 {42 return hWnd;43 }44 }45 //返回z序中的前一个或后一个窗口的句柄46 hWnd = ::GetNextWindow(hWnd , GW_HWNDNEXT);47 }48 return hWnd;49 }50 //前端显示并置顶窗口51 void ShowForeGround(HWND hWnd)52 {53 if (hWnd)54 {55 //显示窗口56 ::ShowWindow(hWnd, SW_NORMAL);5758 //前端显示59 ::SetForegroundWindow(hWnd);6061 //窗口置顶62 ::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);63 }64 else65 {66 ::MessageBox(NULL, _T("未找到窗口"), _T("提示"),MB_OK);67 }68 }69 void main()70 {71 // TODO: 在此添加控件通知处理程序代码72 DWORD dwPid = GetPidByProcessName(_T("notepad.exe"));73 HWND hWnd = GetHwndByPid(dwPid);74 ShowForeGround(hWnd);75 }。
//利用句柄查出进程的详细信息#include <windows.h>#include <tlhelp32.h>#include <iostream.h>#pragma comment(lib, "kernel32.lib")//当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法DWORD GetKernelModePercentage(const FILETIME &ftKernel, //在核心状态下消耗的时间const FILETIME &ftUser)//在用户状态下消耗的时间{//将FILETIME结构化为64位整数ULONGLONG qwKernel = (((ULONGLONG) ftKernel.dwHighDateTime)<<32) + ftKernel.dwLowDateTime;ULONGLONG qwUser = (((ULONGLONG) ftUser.dwHighDateTime)<<32) + ftUser.dwLowDateTime;//将消耗时间相加,然后计算消耗在内核模式下的时间百分比ULONGLONG qwTotal = qwKernel + qwUser;DWORD dwPct = (DWORD)(((ULONGLONG) 100*qwKernel) / qwTotal);return(dwPct);}//以下是将当前运行进程名和消耗在内核模式下的时间百分比分数都显示出来的应用程序void main(){HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,//提取当前进程0);//如果是当前进程,就将其忽略//初始化进程入口PROCESSENTRY32 pe; //用来存放快照进程信息的一个结构体,引用所需包含的头文件#include “tlhelp32.h”::ZeroMemory(&pe,sizeof(pe));//为pe分配存储空间,并将其清0pe.dwSize = sizeof(pe);//按所有进程循环BOOL bMore = ::Process32First(hSnapshot, &pe);//获得进程快照中的第一个进程信息while(bMore){//打开用于读取的进程HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMA TION,//指明要得到的信息FALSE,//不必继承这一句柄pe.th32ProcessID);//要打开的进程if(hProcess!=NULL){//找出进程的时间FILETIME ftCreation, ftExit, ftKernelMode, ftUserMode;::GetProcessTimes(hProcess,//所感兴趣的进程&ftCreation,//进程的启动时间(绝对的)&ftExit,//结束时间(如果有的话)&ftKernelMode,//在内核模式下消耗的时间&ftUserMode);//用户模式下消耗的时间//计算内核模式消耗的时间百分比DWORD dwPctKernel = ::GetKernelModePercentage(ftKernelMode,//内核模式上消耗的时间ftUserMode);//在用户模式下消耗的时间//向用户显示进程的某些信息cout<<"Process ID:"<<pe.th32ProcessID<<",EXE file: "<<pe.szExeFile<<", % in kernel mode:"<<dwPctKernel<<endl;//消除句柄::CloseHandle(hProcess);}//转向下一个进程bMore = ::Process32Next(hSnapshot, &pe);}}。
C++根据进程获取主窗⼝的句柄// processenum.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Windows.h>#include <stdio.h>#include <tchar.h>#include <Psapi.h>#include <string.h>#pragma comment ( lib, "Psapi.lib" )HWND lmshwnd;BOOL CALLBACK EnumWindowsProc(HWND hwnd,DWORD lParam){DWORD mpid;GetWindowThreadProcessId(hwnd,&mpid);if (mpid==lParam){int i=GetWindowTextLength(hwnd);char szhello[255];char lmschar[255]=_T("名称");GetWindowText(hwnd,szhello,i+1);if (strstr(szhello,lmschar)){printf("%s\n",szhello);lmshwnd=hwnd;}}return TRUE;}void PrintProcessNameAndID( DWORD processID ){TCHAR szProcessName[MAX_PATH] = TEXT("unknow");//根据进程ID,打开进程返回进程的句柄HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,processID ); //得到进程名if (NULL!=hProcess ){HMODULE hMod;DWORD cbNeeded;//EnumProcessModules根据句柄获取实例,保存到hMod中if (EnumProcessModules( hProcess,&hMod,sizeof(hMod),&cbNeeded) ){//获取根据进程句柄获取进程名称 szProcessNameGetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName)/sizeof(TCHAR) );}}//打印进程名和进程ID,其进程句柄为hProcessTCHAR *lmsname=TEXT("LMSVirtualLab.EXE");if (!strcmp(szProcessName,lmsname)){_tprintf( TEXT("%s (PID: %x)\n"),szProcessName,processID);EnumWindows((WNDENUMPROC)EnumWindowsProc,processID);//HDESK hDesk=OpenDesktop(_T(""),0,FALSE,DESKTOP_ENUMERATE);//EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,processID);}CloseHandle( hProcess );}int _tmain(int argc, _TCHAR* argv[]){// 得到进程ID的列表DWORD aProcesses[1024], cbNeeded, cProcesses;unsigned int i;//列举所有进程的ID,返回到aProcesses数组中if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0;//计算⼀共返回了多少个进程IDcProcesses = cbNeeded / sizeof(DWORD);//打印每个进程的名称和对应的IDfor ( i = 0; i < cProcesses; i++ ){if( aProcesses[i] != 0 ){PrintProcessNameAndID(aProcesses[i]);}}printf("%x\n",lmshwnd);ShowWindow(lmshwnd,SW_MAXIMIZE);return 0;}。