Автор
|
Тема: Получить все окна приложения
|
void |
опубликован 22-01-2002 00:44 MSK
Собственно, сабж. Получить потоки и окна им соответствующие для данного приложения. Если можно - как это оформить в виде дерева (подчиненнсть).
|
ADK
|
опубликован 22-01-2002 05:53 MSK
...И получится Spy++... Для 9x: функции toolhelp типа Process32First, Process32Next, Thread32First, Thread32Next... Для NT - psapi - EnumProcesses и т.д. (кстати, как там в NT с потоками?), общие функции - EnumWindows, EnumThreadWindows, может ещё что. |
void
|
опубликован 22-01-2002 16:44 MSK
Именно. Нужно для '98. DWORD cur_proc; cur_proc=GetCurrentProcessId(); m_list_thr.ResetContent(); HANDLE hSnap=NULL; hSnap = СreateToolhelp32SnapshotTH32CS_SNAPTHREAD,0); if (hSnap == NULL) { AfxMessageBox("Error Load ToolHelp"); } THREADENTRY32 thr; if (Thread32First(hSnap, &thr)) { char id; itoa((int)thr.th32ThreadID,&id,16); m_list_thr.AddString(&id); while (Thread32Next(hSnap, &thr)) { itoa((int)thr.th32ThreadID,&id,16); m_list_thr.AddString(&id); } } CloseHandle(hSnap); Это дело не работает - почему? Spy все отслеживает... |
void
|
опубликован 22-01-2002 16:46 MSK
Именно. Нужно для '98. DWORD cur_proc; cur_proc=GetCurrentProcessId(); m_list_thr.ResetContent(); HANDLE hSnap=NULL; hSnap = СreateToolhelp32SnapshotTH32CS_SNAPTHREAD,0); if (hSnap == NULL) { AfxMessageBox("Error Load ToolHelp"); } THREADENTRY32 thr; if (Thread32First(hSnap, &thr)) { char id; itoa((int)thr.th32ThreadID,&id,16); m_list_thr.AddString(&id); while (Thread32Next(hSnap, &thr)) { itoa((int)thr.th32ThreadID,&id,16); m_list_thr.AddString(&id); } } CloseHandle(hSnap); Это дело не работает - почему? Spy++ все отслеживает... |
ADK
|
опубликован 23-01-2002 05:48 MSK
Посмотри пример Process Viewer из Platform SDK. |
ADK
|
опубликован 23-01-2002 05:52 MSK
Вот может поможет мой код для получения путей всех запущенных приложений в массив строк. Все функции привязаны через GetProcAddress, чтобы работало во всех ОС.void GetCurrentProcessesModules(CSimpleStrArray& sa) { if(IsRunningUnderNT()) { HANDLE hProc; HMODULE hModHandle; DWORD dwCount, dwcbNeeded, dwIdPocesses[200]; char szExeName[MAX_PATH]; if(!pfnEnumNTProcesses(dwIdPocesses, sizeof(dwIdPocesses), &dwcbNeeded)) return; for(UINT i = 0; i < dwcbNeeded / sizeof(DWORD); i++) { hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwIdPocesses[i]); if(hProc>0) { if(!EnumProcessModules(hProc, &hModHandle, sizeof(HMODULE) , &dwCount)) { CloseHandle(hProc); continue; } if(GetModuleFileNameEx(hProc, hModHandle, szExeName, sizeof(szExeName))>0) { sa.Add(szExeName); CloseHandle(hProc); continue; } } CloseHandle(hProc); } } else // Win9x or Me { HANDLE hProcessSnap; PROCESSENTRY32 pe32 = {0}; hProcessSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == (HANDLE) -1) return; pe32.dwSize = sizeof(PROCESSENTRY32); if (pProcess32First(hProcessSnap, &pe32)) { BOOL bGotModule; MODULEENTRY32 me32 = {0}; do { bGotModule = GetProcessModule(pe32.th32ProcessID,pe32.th32ModuleID,&me32,sizeof(MODULEENTRY32)); if (bGotModule) { sa.Add(pe32.szExeFile); } } while (pProcess32Next(hProcessSnap, &pe32)); } CloseHandle (hProcessSnap); } } |
ADK
|
опубликован 23-01-2002 05:55 MSK
Название функции не мотри, что-то я его забыл исправить ;-) |