HANDLE GetProcessHandle(int nID)
{
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(peszExeFile, pName)) {
CloseHandle(hSnapshot);
return GetProcessHandle(peth32ProcessID);
}
}
return NULL;
}
PS你的代码不够精炼,所以重新写了一个。你看下这个能用不,不能用再帮你找找你的错误。主要你的代码太长了,所以没细看,你的Pn酱紫初始化啊,还有既然是DLL的,那就应该分别做LPCWSTR和LPCSTR两个版本,看你在LPCSTR版本里还用Process32FirstW,是不是有些混乱了?Pn被填充了UNICODE字符集再去和LPCSTR做比较,怎么能得出正确结果呢? 还有那个那个连COM的东西也出来了,完全被雷倒了,休克中
===================================
贴上来的代码都已很负责任的运行通过,不会有错你再检查看看是由于什么引起编译错误可以把出错信息贴上来然后帮你分析看看
另外,workingroy说要提权,DLL是不是应该自作主张提权有待商榷,提权完全可以由客户程序负责决定可以在调用函数前提权,函数调用完恢复原来的权限另外就是提权 *** 作也有消耗,对于系统管理员身份运行(通常我们都是系统管理员身份登陆WINDOWS),不需要提权当然,有高手指出,VISTA和7对系统管理员的权限已经有了修改,既是是系统管理员,权限也受到了某些限制这个我没研究过持保留意见当然楼主的函数应该在提供一个参数,用来传递要打开的进程句柄的权限一般不需要PROCESS_ALL_ACCESS的
一、新建一个模块,复制下面代码:
Option Explicit
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32dll" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Type MODULEENTRY32
dwsize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Byte
modBaseSize As Long
hModule As Long
szModule As String 256
szExePath As String 1024
End Type
Function GetPrcNameFromWnd(Wnd As Long) As String
Dim lPid As Long, TmpStr As String
Dim hSnapshot As Long
Dim Mode As MODULEENTRY32
Dim mSnapshot As Long
Dim Id As Long
GetWindowThreadProcessId Wnd, Id
hSnapshot = Id '获得进程“快照”的句柄
mSnapshot = CreateToolhelpSnapshot(&H8, hSnapshot)
Modedwsize = Len(Mode)
lPid = Module32First(mSnapshot, Mode)
If lPid <> 0 Then '当返回值非零时继续获取下一个进程
TmpStr = Left(ModeszExePath, InStr(ModeszExePath, Chr(0)) - 1)
If InStr(TmpStr, ":") > 2 Then TmpStr = Mid(TmpStr, InStr(TmpStr, ":") - 1)
'进程的执行程序的路径
GetPrcNameFromWnd = TmpStr
End If
CloseHandle (mSnapshot) '关闭模块快照句柄
End Function
二、调用举例:
Dim Wnd as long,PrcName as String
Wnd=3700 '窗口句柄
PrcName=GetPrcNameFromWnd(Wnd)
你可以用 [DllImport("user32dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(
string lpClassName,
string lpWindowName
);
来获得窗体句柄,然后直接用C#的process类获得所有进程的句柄和ID然后比对就可以了
首先你要知道 你要找的是进程的句柄。句柄是 *** 作系统 *** 作的对象,任何一个对象比如一个textbox 也有他的句柄,不一定只要窗口才有句柄。现在你要找到进程的句柄,貌似用C#的话必须要用API 可以用Delphi 试试 这样比较方便
方法/步骤
启动易语言,新建Windows窗口程序。
选择‘程序’(数字1处)-->双击‘DLL命令’(数字2处)--> 右键单击如图标注(数字3处) ---选择‘新建DLL命令’。
输入如下图所示信息。途中所使用的DLL可以获取与指定窗口关联在一起的一个线程和进程标识符。其参数一填写指定窗口句柄,参数二填写一个变量,在使用这个命令后,在参数二中填写的变量,其值将自动变更为进程标识符。
双击启动窗口,写下如图所示代码,其输出值为本程序的进程ID,其值和使用任务管理器获得的值相同。
以上就是关于高分求解。VC++ 通过进程名或进程ID获取进程句柄全部的内容,包括:高分求解。VC++ 通过进程名或进程ID获取进程句柄、VB 6.0 知道某个窗口的句柄,怎么根据这个句柄来查找改窗口的进程名称!、C# 怎么样根据窗口句柄获得进程ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)