Herausbekommen welches Programm mich nervt.
-
Hallo!
Ich habe das Problem das meine offenen Programme(z.B. Firefox) hin und wieder den Fokus verlieren und ich nicht mehr tippen kann. Ich denke das irgendein anderes Programm kurzeitig den Fokus beansprucht, weiß aber nicht welches Programm(oder Prozess) das ist.
Ich hab es erstmal mit dem code Versucht:
#include <iostream> #include <Windows.h> int main() { char Title[256]; while(true) { HWND ForegroundWindow = GetForegroundWindow(); GetWindowTextA(ForegroundWindow, Title, 256); Sleep(1000); std::cout<<Title<<std::endl; } int ExitPromt; std::cin>>ExitPromt; }
dort bekomm ich aber nichts raus, weil die Ausgabe leer ist wenn das Problem auftritt, weil kein fenster im vordergrund ist.
Jemand eine idee?
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
GetWindowThreadProcessId mit in die Schleife.
-
Mit einem eigenen Fenster in dem du WM_ACTIVATEAPP behandelst könntest du den Zeitpunkt rausbekommen wann es passiert. Natürlich nur wenn das Fenster der Test-Applikation zu dem Zeitpunkt gerade den Fokus hat.
Möglicherweise reicht es wenn du beim Erhalt von WM_ACTIVATEAPP sofort GetForegroundWindow + GetWindowText aufrufst. In einer Schleife ein paar hundert bis tausend mal, aber auf jeden Fall ohne Sleep.
EDIT: vielleicht bekommst du sogar ein WM_ACTIVATE. (Weiss nicht genau, könnte auch sein dass WM_ACTIVATE nur kommen wenn innerhalb der eigenen Applikation der Fokus wechselt - so genau hab ich mich damit nie beschäftigt.) Das wäre gut, denn bei WM_ACTIVATE bekommst du das Handle des anderen Fensters mitgegeben. Dann könntest du direkt den Klassennamen/Fenstertitel etc. ausgeben - das wäre natürlich viel einfacher.
EDIT2: sonst guck dir mal die verschiedenen Hooks an die es unter Windows gibt, vielleicht ist da was dabei was man verwenden könnte.
-
Hab es jetzt so geschrieben:
case WM_ACTIVATEAPP: StealerWindow = GetForegroundWindow(); GetWindowTextA(StealerWindow, Title, 256); GetWindowThreadProcessId(StealerWindow, &StealersProcessID); _itoa(lParam, Buffer, 10); if(wParam == false) { MessageBoxA(NULL, Buffer, "Activated!", MB_ICONEXCLAMATION | MB_OK); } break;
wParam gibt mir an ob Deaktviert oder Aktiviert wurde.
lParam gibt mir "The thread identifier", also irgendeine nummer(Mein Visual Express hat z.b. 7708 zurückgegeben).
Wie kann ich diese Nummer nun einem Prozess im Taskmanager o.ä. zuordnen?
Hab mal nachgesehen, es ist nicht die nummer die im Taskmanger unter PID aufgelistet wird...
-
Nochmal dasselbe mit 3 unnützen Zeilen entfernt:
case WM_ACTIVATEAPP:
_itoa(lParam, Buffer, 10);
if(wParam == false) {
MessageBoxA(NULL, Buffer, "Activated!", MB_ICONEXCLAMATION | MB_OK);
}
break;