WINAPI 怎么获得自身获取当前进程句柄柄HWND和程序文件名

在线急求:怎么由进程句柄HANDLE获得进程主窗口的句柄HWND啊 - VC/MFC当前位置:& &&&在线急求:怎么由进程句柄HANDLE获得进程主窗口的句在线急求:怎么由进程句柄HANDLE获得进程主窗口的句柄HWND啊&&网友分享于:&&浏览:91次在线急求:如何由进程句柄HANDLE获得进程主窗口的句柄HWND啊? 如何由进程句柄HANDLE获得进程主窗口的句柄HWND啊?
同一程序,我启动了五个副本,我已经获得每个副本的句柄(CreateProcess返回),有没有办法获得其主窗口的句柄啊。。急求啊。。。 ------解决方案--------------------一个进程可以拥有很多主窗口,也可以不拥有主窗口,所以这样的函数是不存在的,所幸的是,相反的函数是有的。所以我们可以调用EnumWindows来判断所有的窗口是否属于这个进程。
typedef struct tagWNDINFO
DWORD dwProcessId;
} WNDINFO, *LPWNDINFO;
BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam)
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lP
if(dwProcessId == pInfo-& dwProcessId)
pInfo-& hWnd = hW
return FALSE;
return TRUE;
HWND GetProcessMainWnd(DWORD dwProcessId)
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
EnumWindows(YourEnumProc,(LPARAM)&wi);
return wi.hW
如果这个进程没有窗口,函数返回NULL
EnumWindowsProc(HWND
GetWindowThreadProcessId(hwnd,
&processID);
(lParam==processID
!g_hWnd==0)
FindProcessWindow(DWORD
processID)
EnumWindows(EnumWindowsProc,
processID);
------解决方案--------------------先得到线程ID再枚举线程窗口
DWORD GetThreadId(
HANDLE Thread
BOOL EnumThreadWindows(
DWORD dwThreadId,
WNDENUMPROC lpfn,
LPARAM lParam
------解决方案--------------------只能枚举,别无它法
因为一个进程中,其实是没有“主窗口”这个概念的,任何由它创建的窗口都有可能是主窗口,也都可能不是主窗口...(拗口)
“主窗口”这个概念用得比较多的可能还是在MFC中,因为MFC要“挂”住主窗口的销毁消息,一旦主窗口Destroy了,MFC就会AfxPostQuitMessage,除此之外,我找不到 &主窗口 &存在的意义了,呵呵
------解决方案--------------------找了半天,好像是没有的。你就枚举吧
------解决方案--------------------只能枚举了
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有windows核心编程(37)
进程句柄不同于进程内核对象的句柄
进程内核对象句柄:代表整个进程的
进程句柄:exe或者dll装入某个进程的地址空间,有唯一的实例句柄,也可以叫做模块句柄
进程句柄的本质是进程模块在进程地址空间中的首地址!
一:GetModuleFileName
DWORD WINAPI GetModuleFileName(
_In_opt_&HMODULE hModule, //进程句柄
_Out_&&&&LPTSTR &lpFilename, //文件名
_In_&&&&&DWORD &&nSize //pszPath指向的内存的大小
如何获得一个进程或者执行文件的模块名呢
通过GetModuleHandleName函数
二:获得进程句柄
获得进程句柄的方式
1、GetModuleHandle函数
2、WinMain函数的第一个参数hInstance
3、使用extern &C& HANDLE __ImageB
GetModuleHandle函数:
1、只检查本进程的地址空间,不检查别的地址空间
2、当参数为NULL时候,这个句柄就是当前程序的起始地址
#include&windows.h&
#include&tchar.h&
extern &C& HANDLE __ImageB//这是一个伪变量,可以看成当前模块的起始地址
int main()
HMODULE hModule = GetModuleHandle(L&Kernel32.dll&);//获得这个模块的句柄
_tprintf(L&%0x\n&, hModule);
//CloseHandle(hModule);模块句柄不要释放
//如何获得当前进程句柄
HMODULE hCurrent_Module = GetModuleHandle(NULL);//这个句柄就是当前程序的起始地址
_tprintf(L&%0x\n&, hCurrent_Module);
/*在DLL中用这个好些*/
_tprintf(L&%0x\n&,& __ImageBase);//直接打印全局变量,就可以获得当前模块句柄
TCHAR filename[MAX_PATH];
GetModuleFileName(hCurrent_Module, filename, MAX_PATH); //获取文件名路径
_tprintf(L&%s\n&, filename);
_gettchar();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6407次
排名:千里之外
原创:67篇
(4)(3)(33)(25)(7)(1)今天心血来潮,在MSDN中看到了一篇Obtain file name from Handle的文章,貌似是这么个标题,看到文章中用到了一个很重要的函数
GetMappedFileName,缺点就是只能获得自己进程打开的文件,其它进程打开的文件貌似不行。
基本思路就是根据HANDLE 创建映射文件,调用GetMappedFileName获得一个DosDevice路径,然后GetLogicaDriveStrings获得盘符字串,依次读取盘符字串获得对应的DosDevice路径,看之前的DosDevice路径中是否有现在的DosDevice路径(strstr),有的话,就拿到盘符字串,然后把之前的DosDevice路径中最后出现\的位置的字串和盘符字串连接起来就行程最后的路径了,没有的话,就再读取下一个盘符的DosDevice路径,依次这样,直到找到为止。
下面是代码。
// GetFileNameByHandle.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "windows.h"
#include "Psapi.h"
int GetFileNameByHandle(HANDLE hFile,LPTSTR buff,DWORD size);
typedef DWORD (WINAPI *MyGetMappedFileName)(HANDLE,LPVOID,LPTSTR,DWORD);
int main(int argc, char* argv[])
//先打开一个文件,获得HANDE之后,把HANDLE传递给GetFileNameByHandle
char filename[]="D:\\456.rar";
HANDLE hFile =CreateFile(filename,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
OPEN_EXISTING,
if(NULL==hFile||INVALID_HANDLE_VALUE==hFile)
printf("open file error%d",GetLastError());
char filepath[MAX_PATH]={0};
GetFileNameByHandle(hFile,filepath,MAX_PATH);
printf("%s\n",filepath);
int GetFileNameByHandle(HANDLE hFile,LPSTR buff,DWORD size)
HANDLE hfilemap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
if(INVALID_HANDLE_VALUE==hfilemap)
printf("file mapping error");
LPVOID lpmap = MapViewOfFile(hfilemap,FILE_MAP_READ|FILE_MAP_WRITE,NULL,NULL,0);
if(NULL==lpmap)
printf("map view file error%d",GetLastError());
//明明添加了Psapi.h 非说我GetMappedFileName没有声明
DWORD length = GetMappedFileName(GetCurrentProcess(),map,buff,size);
MyGetMappedFileName GetMappedFileName =(MyGetMappedFileName)GetProcAddress(LoadLibrary("psapi.dll"),"GetMappedFileNameA");
if(GetMappedFileName==NULL)
printf("Get funcaddress error");
DWORD length = GetMappedFileName(GetCurrentProcess(),lpmap,buff,size);
if(0==length)
printf("get mapped file name error");
printf("%s",buff);
char DosPath[MAX_PATH]={0};
char DriverString[MAX_PATH]={0};
GetLogicalDriveStrings(MAX_PATH,DriverString);
char * p = (char *)DriverS
//p用来指向盘符
*(p+2)='\0'; //由于QuerDosDevice第一个参数必须是c:这种类型的,不能有\所以我把那个\给抹掉了
QueryDosDevice((LPCTSTR)p,DosPath,MAX_PATH);
char * q = strstr(buff,DosPath);//检测buff中是否有DosDevice中的DosPath,有的话,p指向的那个字串就是要的盘符
//找到之后应该把buff中最后一个出现\地方的字串复制过来和盘符组成路径
q = strrchr(buff,0x5c);
//再把DriverString路径中其它字符清零,只留下找到的盘符
memset(p+2,0,MAX_PATH-2);
strcat(p,q);
//连接路径
strcpy(buff,p);
//指针移动到DriverString的下一个盘符处
}while(*p!=0);
阅读(...) 评论()13:32 提问
C# winfrom项目,怎么样实现通过WINAPI 关闭对象的句柄窗口后,还能再次获取该句柄窗口
在C# Winfrom项目中,from窗体中,有一个Panel控件。
目前已经实现将对象的窗口通过winAPI获取到句柄窗口放到了Panel控件中。
请问怎么样实现关闭from窗体后,下次再进入from窗体后,还通过winAPI获取到句柄窗口放到了Panel控件中。
关闭from窗体的事情需要怎么样写,才能实现通过winAPI获取到句柄窗口放到了Panel控件中。
附上代码(通过winAPI获取到句柄窗口放到了Panel控件中):
private void Form2_Load(object sender, EventArgs e)
ptrskypeWnd = API.FindWindow("CBoxMainFrame", null);
API.SetWindowPos(ptrskypeWnd, new IntPtr(-2), 0, 0, Global.Globals.Object_WIDTH, Global.Globals.Object_HEIGHT, 0x0002);
System.Threading.Thread.Sleep(500);
MyInvoke mi = new MyInvoke(SetPanel);
BeginInvoke(mi, new object[] { ptrskypeWnd });
/// &summary&
/// 将嵌入Panel控件
/// &/summary&
public void SetPanel(IntPtr ptrskypeWnd)
//label1.Text += str + System.Environment.NewL
API.SetParent(ptrskypeWnd, this.panel1.Handle);
API.ShowWindow(ptrskypeWnd, WindowsApi.API.SW_MAXIMIZE);
按赞数排序
再Closing()事件中通过SetParent()把ptrskypeWnd还原到桌面窗口上(类名#32769),避免该窗口被连带关闭。
下次Load()事件中就能原样操作了。
IntPtr ptrDocmentWnd = API.FindWindow("#32769", null);
API.SetParent(ptrWnd, ptrDocmentWnd);
ptrDocmentWnd一直为零,找不到桌面窗口句柄。是不是那有误呀,帮忙看看?
其他相似问题WPF项目回顾(2)
winAPI编程(3)
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
//根据窗口来获取进程ID,
public static int GetCurrentProcessID()
GetWindowThreadProcessId(CurrentGameHandler, out oo);
//获取窗口句柄,我一般都是用lpClassName来获取特定窗口,曾经使用过lpWindowName,好像无法获取到窗口的句柄,不知道为什么;ps:可以使用vs自带的spy++工具来查看特定窗口的类名称
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6370次
排名:千里之外
原创:12篇
(1)(1)(3)(1)(3)(1)(1)(1)(2)(1)(2)}

我要回帖

更多关于 c 获得进程句柄 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信