有id的话,
1、用OpenProcess通过ID打开进程,获得进程句柄(windowsh,kernel32lib)
2、用GetProcessImageFileName获得程序名(psapih,kernel32lib或psapilib)
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的
你是想把消息发给MFC 对话框主窗口,还是主窗口中的一个控件(比如该窗口中的一个按钮或都编辑框)?
首先,要确保你已经用findwindow,找到了该对话框的HWND;
然后用GetDlgItem得到你要控制的控件的HWND,然后再把消息发给这个控件。
to
agui:
HWND
FindWindow(
LPCTSTR
lpClassName,
//
pointer
to
class
name
LPCTSTR
lpWindowName
//
pointer
to
window
name
);MY
EMAIL:NCLGH@stinfonet
大年夜师,你好!我方才接触DELPHI,关于LPCLASSNAME和lpWindowName类型我总不会转换,如FINDDOW该怎么竽暌姑
先谢!
只能获取最前的那个窗口句柄
版本 2
子程序 进程_名取句柄0, 整数型, , 找不到将返回0
参数 进程名, 文本型
局部变量 sHandle, 整数型
局部变量 Pn, PROCESSENTRY32
局部变量 lpTe, THREADENTRY32
局部变量 Found, 整数型
局部变量 ret, 整数型
局部变量 sThread, 整数型
局部变量 tFound, 整数型
sHandle = CreateToolhelp32Snapshot (15, 0)
Pndwsize = 296
Found = Process32First (sHandle, Pn)
判断循环首 (Found ≠ 0)
如果真 (到小写 (到文本 (PnszExefile)) = 到小写 (进程名))
sThread = CreateToolhelp32Snapshot (4, 0)
lpTedwSize = 28
tFound = Thread32First (sThread, lpTe)
判断循环首 (tFound ≠ 0)
如果真 (lpTeth32OwnerProcessID = Pnth32ProcessID)
EnumThreadWindows (lpTeth32ThreadID, &EnumThreadWndProc, ret)
跳出循环 ()
如果真结束
tFound = Thread32Next (sThread, lpTe)
判断循环尾 ()
CloseHandle (sThread)
跳出循环 ()
如果真结束
Found = Process32Next (sHandle, Pn)
判断循环尾 ()
CloseHandle (sHandle)
返回 (ret)
子程序 EnumThreadWndProc, 整数型
参数 hwnd, 整数型
参数 lParam, 整数型, 参考
局部变量 lHwnd1, 整数型
局部变量 lHwnd2, 整数型
lHwnd1 = GetParent (hwnd)
判断循环首 (lHwnd1 ≠ 0) ' 用取父窗口的方法,循环找到他祖宗 :)
lHwnd2 = lHwnd1
lHwnd1 = GetParent (lHwnd1)
判断循环尾 ()
如果真 (lHwnd2 ≠ 0)
lParam = lHwnd2
返回 (0)
如果真结束
返回 (1)
版本 2
DLL命令 CreateToolhelp32Snapshot, 整数型
参数 dwFlags, 整数型
参数 th32ProcessID, 整数型
DLL命令 Process32First, 整数型
参数 hSnapShot, 整数型
参数 uProcess, PROCESSENTRY32
DLL命令 Thread32First, 整数型, "KERNEL32DLL", "Thread32First"
参数 hSnapshot, 整数型
参数 lpte, THREADENTRY32
DLL命令 EnumThreadWindows, 整数型, "user32", "EnumThreadWindows"
参数 dwThreadId, 整数型
参数 lpfn, 子程序指针
参数 lParam, 整数型, 传址
DLL命令 Thread32Next, 整数型, "KERNEL32DLL", "Thread32Next"
参数 hSnapshot, 整数型
参数 lpte, THREADENTRY32
DLL命令 CloseHandle, 整数型, "kernel32"
参数 hObject, 整数型
DLL命令 Process32Next, 整数型
参数 hSnapShot, 整数型
参数 uProcess, PROCESSENTRY32
DLL命令 GetParent, 整数型, "user32", "GetParent"
参数 hwnd, 整数型
版本 2
数据类型 PROCESSENTRY32
成员 dwsize, 整数型, , , 296
成员 cntusage, 整数型, , , 引用数
成员 th32ProcessID, 整数型, , , 进程标识符
成员 th32defaultheapid, 整数型, , , 默认堆ID
成员 th32moduleid, 整数型, , , 进程模块标识符
成员 cntthreads, 整数型, , , 线程数
成员 th32ParentProcessID, 整数型, , , 父进程标识符
成员 pcpriclassbase, 整数型, , , 线程优先权
成员 dwflags, 整数型
成员 szExefile, 字节型, , "260", 进程名称
数据类型 THREADENTRY32
成员 dwSize, 整数型
成员 cntUsage, 整数型
成员 th32ThreadID, 整数型
成员 th32OwnerProcessID, 整数型
成员 tpBasePri, 整数型
成员 tpDeltaPri, 整数型
成员 dwFlags, 整数型
所谓句柄实际上是一个数据,是一个Long (整长型)的数据。 句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。 如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的 *** 作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢 为了解决这个问题,Windows *** 作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象 本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行 *** 作。 但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入**院看**看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次**院售给我们的门票总是不同的一个座位是一样的道理。 线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。 在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点。 线程,也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。 线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。 在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。大多数支持多处理器的 *** 作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度(affinity)。 进程是程序在一个数据集合上运行的过程(注:一个程序有可能同时属于 多个进程),它是 *** 作系统进行资源分配和调度的一个独立单位,进程可以简单的分为系统进程(包括一般 Windows程序和服务进程)和用户进程
以上就是关于由程序进程id或窗口句柄如何获得程序名全部的内容,包括:由程序进程id或窗口句柄如何获得程序名、高分求解。VC++ 通过进程名或进程ID获取进程句柄、在windows API应用程序中(一个进程)获取一个MFC对话框(另一个进程)的句柄 诸大神请帮忙等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)