Mit C++ Programm einen Prozess einfrieren und entfrieren?
Gibt es da eine Möglichkeit das zu tun. Wäre auch bereit batch zu nutzen.
4 Antworten
Ich glaube am einfachsten ist das hier:
https://docs.microsoft.com/de-de/windows/win32/api/debugapi/nf-debugapi-debugactiveprocess
https://docs.microsoft.com/de-de/windows/win32/api/debugapi/nf-debugapi-debugactiveprocessstop
Bei pid? Der gibt immer den richtigen Wert. Es klappt auch alles, nur der DebugActiveProcess(pid); nicht
Wo steht der Wert denn drin, den ich returnen möchte?
Mit dieser Variante von Stackoverflow beschrieben scheint es zu funktionieren:
https://stackoverflow.com/questions/11010165/how-to-suspend-resume-a-process-in-windows
Ich habe den Code, nur insofern abgeändert das auch ein Fortsetzen möglich ist:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
void SuspendProcess(DWORD processId, bool suspend = true)
{
HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
THREADENTRY32 threadEntry;
threadEntry.dwSize = sizeof(THREADENTRY32);
Thread32First(hThreadSnapshot, &threadEntry);
do
{
if (threadEntry.th32OwnerProcessID == processId)
{
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE,
threadEntry.th32ThreadID);
if (suspend)
SuspendThread(hThread);
else
ResumeThread(hThread);
CloseHandle(hThread);
}
} while (Thread32Next(hThreadSnapshot, &threadEntry));
CloseHandle(hThreadSnapshot);
}
#define ResumeProcess(processId) SuspendProcess(processId, false)
int main()
{
auto window = FindWindowA(NULL, "Alan Wake Trainer");
DWORD pid = 0;
GetWindowThreadProcessId(window, &pid);
SuspendProcess(pid);
system("pause");
ResumeProcess(pid);
return 0;
}
Funktioniert der Code bei dir? Bei mir nicht, aber danke!
Mit Visual Studio 2019 Kompiliert, funktioniert einwandfrei.
Der Rückgabewert der GetWindowThreadProcessId ist die Thread ID und beim Parameter lpdwProcessId wird die Prozess ID ausgegeben.
Weiß nicht, wo das Problem ist, musst nur die Doku lesen:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowthreadprocessid
Ich weiß, aber im taskmanager hat der Prozess eine andere ID
und der Code klappt bei mir nicht und ich habe ebenfalls Visual Studio 2019 Community
https://stackoverflow.com/questions/11010165/how-to-suspend-resume-a-process-in-windows
Ich fürchte es gibt keinen leichten Weg das zu tun.
Wie auf stackoverflow beschrieben:
- Alle Threads durchgehen und SuspendThread aufrufen.
- Die undokumentierte NtSuspendThread verwenden, jedoch ist das Programm dann nicht zukunftssicher.
Wenn du unter Windows bist dann probiere mal das hier:
https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep
Ich meine einen anderen Prozess anhalten. Wie es der Ressourcen Monitor macht.
debugactiveprocess habe ich schon probiert, es hält den Prozess jedoch nicht an... Keine Ahnung warum es das nicht tut.
Mein Code:
#include <iostream>
#include <Windows.h>
HWND window;
DWORD pid;
int main()
{
window = FindWindowA(NULL, "Alan Wake Trainer");
GetWindowThreadProcessId(window, &pid);
std::cout << pid;
Sleep(2000);
DebugActiveProcess(pid);
Sleep(4000);
}