求问获取窗口句柄问题 一个网游的窗口,句柄被隐藏了试过用GetForeGround,WindowFromPoint,EnumWindow都没办法获取句柄。但是在spy++里却能找到这个句柄。求问如何在程序里找到句柄? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 spy++是不是通过进程获取的窗口句柄呢?这个窗口的进程能找到。求问如何通过进程获取句柄?我在用C#,最好给出C#的dllimport语句。 SPY++是通过WindowFromPoint函数,得到窗口句柄的,你可以考虑用这个函数试试先得到鼠标位置,然后用WindowFromPoint返回鼠标位置处的窗口句柄 我试过了,windowfrompoint无法获取这个窗口的句柄 通过进程获取窗体句柄。#include "Psapi.h"#pragma comment(lib, "Psapi.lib")BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);BOOL ComparProcessnameById(DWORD processID, LPCTSTR pName);void CGetProcessUserDlg::OnBnClickedButtonGetwindowtext(){ TCHAR tmp[MAX_PATH]; memset(tmp,0,MAX_PATH); wcscpy(tmp,_T("notepad.exe")); //打开一个记事本程序,你也可以手动打开一个,用来枚举这个程序,当然也可以是任意程序. //这两行代码仅用来示例,实际使用时无需这两行。 ShellExecute(NULL,_T("open"),tmp,NULL,NULL,SW_MINIMIZE); Sleep(1000); //获取“记事本”的进程ID DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if (EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded )) { cProcesses = cbNeeded / sizeof(DWORD); for (i = 0; i < cProcesses; i++) if( aProcesses[i] != 0 ) if (TRUE == ComparProcessnameById(aProcesses[i], tmp)) EnumWindows(EnumWindowsProc,aProcesses[i]); }}BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam){ TCHAR tWindowText[256],tWindowClassName[256]; DWORD dwID = -1; //获得该“窗体”的进程ID GetWindowThreadProcessId(hwnd,&dwID); if (dwID == lParam) { //由于该进程ID下的所有窗体都将被枚举到,而我们只需要主窗体的Text; //使用spy++查看主窗体的“类名”,与之匹配的才是我们需要的。 GetClassName(hwnd,tWindowClassName,256); if (0 == _tcscmp(tWindowClassName,_T("Notepad"))) { memset(tWindowText,0,256); GetWindowText(hwnd,tWindowText,256);//////////////这里用到的hwnd就是你要找到的目标窗口的句柄。 //输出结果 TCHAR tmp[256]; memset(tmp,0,256); _stprintf(tmp,_T("%s\n"),tWindowText); OutputDebugString(tmp); } } return TRUE;}BOOL ComparProcessnameById(DWORD processID, LPCTSTR pName){ TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // 获得进程的句柄 HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, processID); // 获得进程名称 if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); if (0 == _tcscmp(szProcessName,pName)) return TRUE; } } CloseHandle( hProcess ); return FALSE;}“//输出结果”中使用的那个句柄“hwnd”应该就是楼主需要的那个句柄吧 但是spy++就是这个原理是不是你具体操作的时候有错误还没听说有什么可以隐藏窗口句柄的方法 如果知道窗口的标题,可以通过FindWindow来查找. 你这个程序是不是directUI的压根没有句柄 事实上有句柄。从spy++里能够看到。但是这个程序被驱动保护了,只接受驱动发来的消息。我遍历了下1-1000的消息,发现这个程序在应用层面,只在接受窗口改变大小的消息。 m_pRecordset.Release()与m_pRecordset=NULL有什么区别呢? 单声道在IE中变成双声道? 发帖质疑,突然少了1000分专家分 统计一下,各位使用什么防火墙 异步套接字 传输文件的问题 我也建了个群20836124大家进啊,多多交流啊!! 在MDI程序中如何将RichEdit的内容存入数据库中? 初学,,WDM驱动开发,难死了,,郁闷ing,有没有高手指点一下???? 动态链接库怎样调试 关于在vc中使用activex的小问题。急急急 Cimage 速度如何 运行错误怎么解决啊
这个窗口的进程能找到。求问如何通过进程获取句柄?我在用C#,最好给出C#的dllimport语句。
我试过了,windowfrompoint无法获取这个窗口的句柄
#include "Psapi.h"
#pragma comment(lib, "Psapi.lib")BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
BOOL ComparProcessnameById(DWORD processID, LPCTSTR pName);void CGetProcessUserDlg::OnBnClickedButtonGetwindowtext()
{
TCHAR tmp[MAX_PATH];
memset(tmp,0,MAX_PATH);
wcscpy(tmp,_T("notepad.exe")); //打开一个记事本程序,你也可以手动打开一个,用来枚举这个程序,当然也可以是任意程序.
//这两行代码仅用来示例,实际使用时无需这两行。
ShellExecute(NULL,_T("open"),tmp,NULL,NULL,SW_MINIMIZE);
Sleep(1000); //获取“记事本”的进程ID
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if (EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded ))
{
cProcesses = cbNeeded / sizeof(DWORD);
for (i = 0; i < cProcesses; i++)
if( aProcesses[i] != 0 )
if (TRUE == ComparProcessnameById(aProcesses[i], tmp))
EnumWindows(EnumWindowsProc,aProcesses[i]); }
}BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
TCHAR tWindowText[256],tWindowClassName[256];
DWORD dwID = -1; //获得该“窗体”的进程ID
GetWindowThreadProcessId(hwnd,&dwID);
if (dwID == lParam)
{
//由于该进程ID下的所有窗体都将被枚举到,而我们只需要主窗体的Text;
//使用spy++查看主窗体的“类名”,与之匹配的才是我们需要的。
GetClassName(hwnd,tWindowClassName,256);
if (0 == _tcscmp(tWindowClassName,_T("Notepad")))
{
memset(tWindowText,0,256);
GetWindowText(hwnd,tWindowText,256);//////////////这里用到的hwnd就是你要找到的目标窗口的句柄。 //输出结果
TCHAR tmp[256];
memset(tmp,0,256);
_stprintf(tmp,_T("%s\n"),tWindowText);
OutputDebugString(tmp);
}
}
return TRUE;
}BOOL ComparProcessnameById(DWORD processID, LPCTSTR pName)
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // 获得进程的句柄
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, processID); // 获得进程名称
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
if (0 == _tcscmp(szProcessName,pName))
return TRUE;
}
}
CloseHandle( hProcess ); return FALSE;
}
“//输出结果”中使用的那个句柄“hwnd”应该就是楼主需要的那个句柄吧
是不是你具体操作的时候有错误
还没听说有什么可以隐藏窗口句柄的方法
压根没有句柄
事实上有句柄。从spy++里能够看到。但是这个程序被驱动保护了,只接受驱动发来的消息。我遍历了下1-1000的消息,发现这个程序在应用层面,只在接受窗口改变大小的消息。