首页 > Windows SDK > 在DLL中获取主进程窗口句柄

在DLL中获取主进程窗口句柄

有的时候难免需要在DLL中获取主进程的窗口句柄,比如在DLL注入的时候等等。那么如何在DLL中获取主进程的窗口句柄呢?可以通过EnumWindows来实现。先通过GetCurrentProcessId获取进程的PID,然后在EnumWindows中调用GetWindowThreadProcessId获得与窗口句柄关联的进程PID,然后对比PID,看是否相等,并判断是不是主窗口即可。
以上方法参考自网络,不一定很完善,但是通常情况下已经够用了。附上测试代码:

// Author: 代码疯子
// Blog: http://www.programlife.net/
#include <windows.h>
 
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
	DWORD dwCurProcessId = *((DWORD*)lParam); 
	DWORD dwProcessId = 0; 
 
	GetWindowThreadProcessId(hwnd, &dwProcessId); 
	if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL)
	{ 
		*((HWND *)lParam) = hwnd;
		return FALSE; 
	} 
	return TRUE; 
} 
 
 
HWND GetMainWindow() 
{ 
	DWORD dwCurrentProcessId = GetCurrentProcessId();
	if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId)) 
	{     
		return (HWND)dwCurrentProcessId; 
	} 
	return NULL; 
} 
 
BOOLEAN WINAPI DllMain(
		IN HINSTANCE hDllHandle, 
		IN DWORD     nReason,    
		IN LPVOID    Reserved)
{
	BOOLEAN bSuccess = TRUE;
 
	switch ( nReason )
	{
	case DLL_PROCESS_ATTACH:
		MessageBox(GetMainWindow(), TEXT("OMG~ You are Attacked!"), TEXT("Warning"), MB_ICONWARNING);
		break;
 
	case DLL_PROCESS_DETACH:
		break;
	}
 
	return bSuccess;
}

效果截图:
DLL注入


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 在DLL中获取主进程窗口句柄
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: Windows SDK 标签: , ,
  1. 2011年8月26日16:26 | #1

    甚好,注入成功,呵呵

    [回复]

    代码疯子 回复:

    @the5fire的技术博客, 呵呵

    [回复]

  2. hahha
    2015年6月1日10:46 | #2

    DLLMain()方法里面的case语句怎么判断,全文没有定义DLL_PROCESS_ATTACH,怎么使用?能不能把工程的全代码都贴上(因为我是菜鸟)

    [回复]