如何获取只有在任务管理器中显示出来的应用程序的句柄 各位大侠帮帮忙 小弟初学vc 如何获取只有在任务管理器中显示出来的应用程序的句柄呀 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 进程还是性能中的句柄?你可以从1-65535或更高,用api校验是不是一个句柄。 HANDLE hProcessSnap = NULL; PROCESSENTRY32 pe32 = {0}; hProcessSnap =(HANDLE)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pe32.dwSize = sizeof(PROCESSENTRY32); Process32First(hProcessSnap, &pe32); do { ProcessID=pe32.th32ProcessID; HANDLE hh=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);//取得进程句柄 } while (Process32Next(hProcessSnap, &pe32)); CloseHandle (hProcessSnap); 应用程序的什么句柄?进程的?还是窗口的?还是GDI的? 我这里有个任务管理器的源代码,你可以参考一下。http://download.csdn.net/source/529874 用EnumWindows,或者FindWindowEx。 #include <windows.h>BOOL CALLBACK wndProc(HWND hWnd, LPARAM){ if ((::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE) && (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE)) { char name[260]; ::GetWindowText(hWnd, name, sizeof(name)); printf("%s\r\n", name); } return TRUE;}int main(int argc, char* argv[]){ ::EnumWindows(wndProc, NULL); system("PAUSE"); return 0;}目前限制到这种程度了,VS比较特殊,会有两个窗口,经过测试发现VS的任务栏窗口和桌面窗口是不同的窗口,导致这种方法找到了两个VS窗口。 (::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE)不起作用 不在任务管理器“应用程序”栏中显示的窗口 也能得到窗口句柄我现在的程序是枚举了所有显示的窗口 但需要屏蔽掉任务管理器“应用程序”栏中没有显示的那些 不知道怎么改 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam){ if(::GetWindowLong(hwnd,GWL_STYLE)& WS_VISIBLE) { char szClassName[128] = {0}; if(GetClassName(hwnd,szClassName,128)) { if(stricmp(szClassName, "HNC_SCREEN_CLASS") != 0) { g_hwndFind[m_num] = hwnd ::ShowWindow(g_hwndFind[m_num],SW_HIDE); m_num++;//count start } } } return TRUE;} 上面的太乱了 重发BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam){ if(::GetWindowLong(hwnd,GWL_STYLE)& WS_VISIBLE) { char szClassName[128] = {0}; if(GetClassName(hwnd,szClassName,128)) { if(stricmp(szClassName, "HNC_SCREEN_CLASS") != 0) { g_hwndFind[m_num] = hwnd;//record the HWND handle into array ::ShowWindow(g_hwndFind[m_num],SW_HIDE); m_num++;//count start } } } return TRUE;} GetWindowLong给GWL_HWNDPARENT参数,判断返回值不为0的过滤掉。 我用自己的机器测试过,开着IE、VS、QQ聊天框,控制台,全都认出来了,而(::GetParent(hWnd) == NULL)过滤不了多少东西,如果你还有其他的窗口没有过滤掉,你可以考虑再增加一些判断啊!话说你说的是什么东西的窗口没给过滤掉,说出来听听…… 机上没有瑞星,不过也有一个窗口有这种情况,加上(::GetParent(hWnd) == NULL)就过滤掉了,也就是 if ((::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE) && (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE) && (::GetParent(hWnd) == NULL)) 有没有大神使用过sinkse 的函数设置XML 里面的属性 制作安装包问题 散分8 #import "msado15.dll",那么程序是怎么知道DLL的路径的 鞠躬求教系统级编程 急,急,急!!!!在线等!!!! 在线等候!急 怎么样产生GUID,不算CoCreateGuid 关于listview控件内实现多个选项(图标)拖动的问题? 关于"防火墙"的设计,高手必进!!!!! mdi框架,怎么在主框架的客户区域添加视图? 在对话框上根据设置最多显示36个窗口在实现中遇到问题,请指点
PROCESSENTRY32 pe32 = {0};
hProcessSnap =(HANDLE)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hProcessSnap, &pe32);
do
{
ProcessID=pe32.th32ProcessID;
HANDLE hh=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);//取得进程句柄
}
while (Process32Next(hProcessSnap, &pe32)); CloseHandle (hProcessSnap);
http://download.csdn.net/source/529874
#include <windows.h>BOOL CALLBACK wndProc(HWND hWnd, LPARAM)
{
if ((::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE) && (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE))
{
char name[260];
::GetWindowText(hWnd, name, sizeof(name));
printf("%s\r\n", name);
}
return TRUE;
}int main(int argc, char* argv[])
{
::EnumWindows(wndProc, NULL);
system("PAUSE");
return 0;
}
目前限制到这种程度了,VS比较特殊,会有两个窗口,经过测试发现VS的任务栏窗口和桌面窗口是不同的窗口,导致这种方法找到了两个VS窗口。
不起作用 不在任务管理器“应用程序”栏中显示的窗口 也能得到窗口句柄
我现在的程序是枚举了所有显示的窗口 但需要屏蔽掉任务管理器“应用程序”栏中没有显示的那些 不知道怎么改
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if(::GetWindowLong(hwnd,GWL_STYLE)& WS_VISIBLE)
{
char szClassName[128] = {0};
if(GetClassName(hwnd,szClassName,128))
{
if(stricmp(szClassName, "HNC_SCREEN_CLASS") != 0)
{
g_hwndFind[m_num] = hwnd
::ShowWindow(g_hwndFind[m_num],SW_HIDE);
m_num++;//count start
}
}
}
return TRUE;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if(::GetWindowLong(hwnd,GWL_STYLE)& WS_VISIBLE)
{
char szClassName[128] = {0};
if(GetClassName(hwnd,szClassName,128))
{
if(stricmp(szClassName, "HNC_SCREEN_CLASS") != 0)
{
g_hwndFind[m_num] = hwnd;//record the HWND handle into array ::ShowWindow(g_hwndFind[m_num],SW_HIDE);
m_num++;//count start
}
}
}
return TRUE;
}
我用自己的机器测试过,开着IE、VS、QQ聊天框,控制台,全都认出来了,而(::GetParent(hWnd) == NULL)过滤不了多少东西,如果你还有其他的窗口没有过滤掉,你可以考虑再增加一些判断啊!话说你说的是什么东西的窗口没给过滤掉,说出来听听……
机上没有瑞星,不过也有一个窗口有这种情况,加上(::GetParent(hWnd) == NULL)就过滤掉了,也就是
if ((::GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_WINDOWEDGE) && (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE) && (::GetParent(hWnd) == NULL))