如何取获得当前进程句柄的实例句柄

C#获取进程的主窗口句柄的实现方法
字体:[ ] 类型:转载 时间:
C#获取进程的主窗口句柄的实现方法,需要的朋友可以参考一下
通过调用Win32 API实现。 代码如下:public class User32API{&&& private static Hashtable processWnd =
&&& 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.Z&&&&&&& uint uiPid = (uint)Process.GetCurrentProcess().Id;& // 当前进程 ID&&&&&&& object objWnd = processWnd[uiPid];
&&&&&&& if (objWnd != null)&&&&&&& {&&&&&&&&&&& ptrWnd = (IntPtr)objW&&&&&&&&&&& if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd))& // 从缓存中获取句柄&&&&&&&&&&& {&&&&&&&&&&&&&&& return ptrW&&&&&&&&&&& }&&&&&&&&&&& else&&&&&&&&&&& {&&&&&&&&&&&&&&& ptrWnd = IntPtr.Z&&&&&&&&&&& }&&&&&&& }
&&&&&&& bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);&&&&&&& // 枚举窗口返回 false 并且没有错误号时表明获取成功&&&&&&& if (!bResult && Marshal.GetLastWin32Error() == 0)&&&&&&& {&&&&&&&&&&& objWnd = processWnd[uiPid];&&&&&&&&&&& if (objWnd != null)&&&&&&&&&&& {&&&&&&&&&&&&&&& ptrWnd = (IntPtr)objW&&&&&&&&&&& }&&&&&&& }
&&&&&&& return ptrW&&& }
&&& 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] =&& // 把句柄缓存起来&&&&&&&&&&&&&&& SetLastError(0);&&& // 设置无错误&&&&&&&&&&&&&&&&& // 返回 false 以终止枚举窗口&&&&&&&&&&& }&&&&&&& }
&&&&&&&&&& }}
调用User32API.GetCurrentWindowHandle()即可返回当前进程的主窗口句柄,如果获取失败则返回IntPtr.Zero。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具本帖子已过去太久远了,不再提供回复功能。C++获取当前进程IAT的方法_C 语言
本文实例讲述了C++获取当前进程IAT的方法,分享给大家供大家参考。
具体实现方法如下:
复制代码 代码如下:
#include &windows.h&
#include &stdio.h&
int main(int argc, char* argv[])
HMODULE hModule = ::GetModuleHandleA(NULL);
IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hM
IMAGE_OPTIONAL_HEADER* pOpNtHeader = (IMAGE_OPTIONAL_HEADER*)((BYTE*)hModule + pDosHeader-&e_lfanew + 24); //这里加24
IMAGE_IMPORT_DESCRIPTOR* pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hModule + pOpNtHeader-&DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (pImportDesc-&FirstThunk)
char* pszDllName = (char*)((BYTE*)hModule + pImportDesc-&Name);
printf("模块名称:%s\n", pszDllName);
DWORD n = 0;
//一个IMAGE_THUNK_DATA就是一个导入函数
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)hModule + pImportDesc-&OriginalFirstThunk);
while (pThunk-&u1.Function)
//取得函数名称
char* pszFuncName = (char*)((BYTE*)hModule+pThunk-&u1.AddressOfData+2); //函数名前面有两个..
printf("function name:%-25s,
", pszFuncName);
//取得函数地址
PDWORD lpAddr = (DWORD*)((BYTE*)hModule + pImportDesc-&FirstThunk) + //从第一个函数的地址,以后每次+4字节
printf("addrss:%X\n", lpAddr);
n++; //每次增加一个DWORD
printf("\n");
pImportDesc++;
希望本文所述对大家的C++程序设计有所帮助。2049人阅读
Windows(21)
使用Win32函数
typedef struct tagWNDINFO
DWORD dwProcessId;
} WNDINFO, *LPWNDINFO;
BOOL CALLBACK MyEnumProc(HWND hWnd,LPARAM lParam)//枚举所有进程
DWORD dwProcId;
GetWindowThreadProcessId(hWnd, &dwProcId);
LPWNDINFO pInfo=(LPWNDINFO)lP
if(dwProcId==pInfo-&dwProcessId)
// 在此添加更多限制条件
CString strT
GetClassName(hWnd, strTmp.GetBuffer(200), 200);
strTmp.ReleaseBuffer();
if (!pare(L&LButton&)) // 按钮, 编辑框TEdit等, 具体可使用Spy++查看
pInfo-&hWnd = hW
return FALSE;
if (IsWindowVisible(hWnd)) // 当前窗口是否可见
pInfo-&hWnd = hW
// 获取到第一个窗口句柄
return FALSE;
return TRUE;
HWND GetProcessHwnd(DWORD proccessId)
wi.dwProcessId = proccessId;
wi.hWnd = NULL;
EnumWindows(MyEnumProc,(LPARAM)&wi);
// EnumChildWindows(hWnPar, MyEnumProc, (LPARAM)&wi); // 枚举窗口的子窗口句柄, MFC中的控作等
return wi.hW
void GetProcessInfo(CString processName)
//创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//PROCESSENTRY32进程快照的结构体
PROCESSENTRY32
//实例化后使用Process32First获取第一个快照的进程前必做的初始化操作
pe.dwSize = sizeof(PROCESSENTRY32);
//下面的IF效果同:
//if(hProcessSnap == INVALID_HANDLE_VALUE)
无效的句柄
if(!Process32First(hSnapShot,&pe))
processName.MakeLower();
BOOL clearprocess = FALSE;
//如果句柄有效
则一直获取下一个句柄循环下去
while (Process32Next(hSnapShot,&pe))
//pe.szExeFile获取当前进程的可执行文件名称
CString scTmp = pe.szExeF
scTmp.MakeLower();
char modPath[MAX_PATH] = {0};
if(!pare(processName))
//从快照进程中获取该进程的PID(即任务管理器中的PID)
DWORD dwProcessID = pe.th32ProcessID;
//获取进程的句柄
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
//获取第一个可视窗口的句柄
HWND hWnd = GetProcessHwnd(dwProcessID);
//获取文件路径
MODULEENTRY32 me={sizeof(me)};
hpro = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
Module32First(hpro,&me);
TRACE(processName + & Path: & + me.szExePath);
::CloseHandle(hpro);
::CloseHandle(hSnapShot);
Spy++的使用:
VS中&工具&-&&Spy++&,选择同名的进程,可查看窗口,包括窗口句柄,窗口名,类型等。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:47006次
积分:1031
积分:1031
排名:千里之外
原创:56篇
(2)(2)(1)(2)(2)(1)(2)(1)(5)(1)(2)(1)(1)(4)(1)(4)(19)(8)(1)(1)(1)(2)(1)

我要回帖

更多关于 获取当前实例句柄 的文章

 

随机推荐