Как заставить работать код с функцией GetModuleFileNameExW для всех процессов в юзермоде? Например для хрома и т.д. Ибо работает не для всех. Код (C): #include <Windows.h> #include <Psapi.h> int main() { HWND foregroundWindow = GetForegroundWindow(); DWORD processId; GetWindowThreadProcessId(foregroundWindow, &processId); HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); if (processHandle != NULL) { WCHAR fileName[MAX_PATH]; if (GetModuleFileNameExW(processHandle, NULL, fileName, MAX_PATH) != 0) { std::wcout << L"Имя процесса: " << fileName << std::endl; } CloseHandle(processHandle); } return 0; } Не сочтите за флуд, для Т.С-а. возможно тоже надобен более полный охват процессов, а не их небольшой части.
А как должен работать твой код? Чьё окно он должен получить? Ведь на момент запуска фокус передаётся твоему приложению, его окно выходит на передний план, и оно получит путь само для себя. Вряд ли это то, что ты задумывал.
HoShiMin, код работает в отдельном потоке, когда юзер открывает/переключает на новое окно в текстовый файл сохраняется имя процесса. Эта часть кода выполняется в вечном цикле, с функцией Sleep(): Код (C++): HWND foregroundWindow = GetForegroundWindow(); DWORD processId; GetWindowThreadProcessId(foregroundWindow, &processId); HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); if (processHandle != NULL) { WCHAR fileName[MAX_PATH]; if (GetModuleFileNameExW(processHandle, NULL, fileName, MAX_PATH) != 0) { std::wcout << L"Имя процесса: " << fileName << std::endl; //вместо этого, запись fileName в txt } CloseHandle(processHandle); } Если в потоке вызвать GetForegroundWindow и GetWindowText, то сохраняется WindowText всех окон, на которые переключает юзер. Хотелось сделать сохранение имен всех процессов. Интересно, это возможно? Да.
Я не понимаю, у тебя есть пид процесса, который ты получил из окна, просто перечисли все процессы и найди среди них тот пид, который ты получил. Зачем тебе открывать процесс? Некоторые процессы ты в принципе не сможешь открыть, даже для квери_информацион.
Rel, благодарю. Получилось так: Код (Pascal): {$APPTYPE CONSOLE} uses Windows, TlHelp32; const dw_time = 100; type ProcList = record ExeName: string; Pid: dword; end; TProcList = array of ProcList; procedure GetProcessList(var Buffer: TProcList); var Handle: THandle; processEntry: TProcessEntry32; begin SetLength(Buffer, 0); Handle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if Handle <> INVALID_HANDLE_VALUE then begin processEntry.dwSize := SizeOf(TProcessEntry32); if Process32First(Handle, processEntry) then begin repeat SetLength(Buffer, Length(Buffer) + 1); Buffer[Length(Buffer) - 1].ExeName := processEntry.szExeFile; Buffer[Length(Buffer) - 1].Pid := processEntry.th32ProcessID; until not Process32Next(Handle, processEntry); end; CloseHandle(Handle); end; end; var i: integer; Buffer: TProcList; last_pid, current_pid: DWORD; begin last_pid := 0; while true do begin GetWindowThreadProcessId(GetForegroundWindow(), @current_pid); if last_pid <> current_pid then begin last_pid := current_pid; GetProcessList(Buffer); for i := 0 to Length(Buffer) - 1 do begin if Buffer[i].Pid = current_pid then begin Writeln('Exe name: ' + Buffer[i].ExeName); end; end; end; Sleep(dw_time); end; ReadLn; end.