比如一个可执行文件 abc.exe 该程序运行时会有一个窗体
可以通过可执行文件的名称获取其运行时的 HWND吗?
可以通过可执行文件的名称获取其运行时的 HWND吗?
解决方案 »
- 寻求学习OSG(open source graph)的学习班,哪里有啊?
- 聘:现场评奖投票软件开发
- 讨论:SDI(实现单文档多视图) VS 对话框上自已加入菜单,toolbar来实现单文档多视图
- FtpSetCurrentDirectory函数遇到"重叠 I/O 操作在进行中"的问题是怎么回事?
- 为什么我的鼠标改不了?
- bin文件夹下面的pdb是什么文件啊?用什么工具可以打开呢??
- 哪里有TFTP的源代码下载
- 关于Dll导入出错的问题…………各路英雄请留步!!!!!!!!!!!!!!(二百分)
- 调查一下,做MFC的一般工资是多少?
- 图像控件添加位图背景,大小不好控制,在位图背景上添加其他控件运行时显示不了
- 我这样分割窗口为什么左边列宽度为0,请大家说说,代码是。。。
- 读数据库与for的矛盾,
LPCTSTR lpClassName, // class name
LPCTSTR lpWindowName // window name
);
2.通过进程句柄,找到窗口句柄
2.通过进程句柄,找到窗口句柄=============想听1。2的详解
用一楼的最快捷:
如:
CWnd *pwnd=FindWindow(NULL,"程序标题");
pwnd->m_hWnd即为它的HWND当然,你也可以用SPY+来得到它的类名,
比如为XXXX,
这样就可以:
CWnd *pwnd=FindWindow("XXXX",NULL);
1.用toolhelp32函数枚举系统线程,再用EnumThreadWindows函数枚举线程窗体2。遍历进程,toolhelp32或PSAPI函数实现。再用EnumWindows或EnumDesktopWindows没举系统窗体,获得窗口句柄,再用GetWindowThreadProcessId函数获得窗口对应的进程ID,和toolhelp32或PSAPI函数得到的进程名比对
LPCTSTR lpClassName, // class name
LPCTSTR lpWindowName // window name
);确实很简单的,也好用.
如果窗体的标题是动态的呢?
xuanzg(小钢娃)
1.遍历进程,查找abc.exe 进程id and 句柄
2.通过进程句柄,找到窗口句柄你说的查找进程应该如何做?
又该如何判断该进程是否存在?
{
PROCESSENTRY32 ProcEntry;
BOOL isExist(0); HANDLE hproc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
memset(&ProcEntry, 0, sizeof(ProcEntry));
ProcEntry.dwSize = sizeof(ProcEntry);
ProcEntry.cntUsage = 1; strcpy(ProcEntry.szExeFile, "hh.exe"); if(Process32First(hproc, &ProcEntry))
{
for(;;)
{
if(!Process32Next(hproc, &ProcEntry))
break;
// HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info->th32ProcessID);
char lpFileName[256] = {0};
HANDLE hProcess =
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
ProcEntry.th32ProcessID
);
//得到进程完全路径
if(NULL != hProcess)
{
HMODULE hMod;
DWORD cbNeeded;
//得到模块句柄
if( EnumProcessModules(hProcess, &hMod, sizeof( hMod ), &cbNeeded))
{
DWORD dw = GetModuleFileNameEx(hProcess, hMod, lpFileName, 256);
}
CloseHandle(hProcess); //比较
if(0 == strcmp(appName, lpFileName))
{
isExist = 1;
break;
}
}
}
}
CloseHandle(hproc);
return isExist;
}
void SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation,
UINT Msg, WPARAM wParam, LPARAM lParam);
static BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);
void CMyWinApp:: SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation,
UINT Msg, WPARAM wParam, LPARAM lParam)
{
FINDWINDOWHANDLESTRUCT fwhs;
fwhs.ProcessInfo = lpProcessInformation;
fwhs.hWndFound = NULL; EnumWindows ( EnumWindowCallBack, (LPARAM)&fwhs ) ; SendMessage ( fwhs.hWndFound, Msg, wParam, lParam );
}CMyWinApp::EnumWindowCallBack(HWND hwnd, LPARAM lParam)
{
FINDWINDOWHANDLESTRUCT * pfwhs = (FINDWINDOWHANDLESTRUCT * )lParam;
DWORD ProcessId;
CString Title;
GetWindowThreadProcessId ( hwnd, &ProcessId ); CWnd::FromHandle( hwnd )->GetWindowText(Title);
if ( ProcessId == pfwhs->ProcessInfo->dwProcessId && Title.GetLength() != 0)
{
pfwhs->hWndFound = hwnd;
return false;
}
else
{
// Keep enumerating
return true;
}
}