GetActiveWindow liefert kein Handle
-
Hallo,
ich versuche gerade den Umgang mit der WinAPI zu lernen und habe folgendes kleines Programm erstellt:
#include <windows.h> #include <iostream> using namespace std; void main(){ HWND handle = ::GetActiveWindow(); cout << "ID: " << ::GetProcessId(handle)<<endl; char buffer[255]; ::GetWindowText(handle,LPWSTR(buffer),254); cout << "Title: " << buffer <<endl; cin >> buffer; }
Nur liefert das immer:
ID: 0
Title:Sollte da nicht eigentlich was anderes bei herauskommen? Das aktive Fenster ist ja das Konsolenfenster
Habe mit Visual C++ 2008 EE eine Win32Konsolenanwendung erstellt(falls das was zur Sache tut)
Und es kam zuerst beim Compilieren der Fehler, dass die MSVCP90D.dll nicht gefunden werden konnte, was ich aber durch "Projekt->Projekt-Eigenschaften->Konfigurationseigenschaften->C/C++->CodeGenerierung->Laufzeitbibliothek" von "Multithreaded-Debugg-DLL" auf "Multithreaded-Debugg" und zurück einstellen, lösen konnte. Warum auch immerDanke im voraus
veio
-
http://msdn2.microsoft.com/en-us/library/ms646292(VS.85).aspx
"The GetActiveWindow function retrieves the window handle to the active window attached to the calling thread's message queue."
alternativ wäre das vllt. was für dich? http://msdn2.microsoft.com/en-us/library/ms633505(VS.85).aspx
-
ok, GetForegroundWindow() liefert beim Handle shcon was anderes als 0.
Aber ProcessId ist immer noch 0 und der Title ist auch noch leer.
GetLastError() gibt 6 zurück..also invalid Handle.
Was mache ich falsch?Insbes. diese Zeile:
char buffer[255]; ::GetWindowText(handle,LPWSTR(buffer),254);
Ist das so richtig mit dem buffer?
-
ach herrje... LESEN! LEEEEEEEEEESEN!
zur übung darfste jetzt mal selber googlen nach "GetProcessId()" ...
kleiner tipp: beschreibung lesen und deinen typ (HWND) mit dem argument-typ in GetProcessId() vergleichen.
tipp: HANDLE ist ein ..oh wunder..HANDLE (zu einem prozess in diesem falle)
HWND ist ein handle zu einem fenster -.-
aber das fenster ist ja nicht der prozessviel erfolg beim suchen und lesen
-
hm, ja tut mir leid
Ging mir auch primär darum, heraus zu finden wie der Titel des Fensters heißt.
Der Buffer enthält immer nur den ersten Buchstaben des Titels.
In den mit der SuFu gefunden Themen zu GetWindowText() geben die auch immer nur den Buffer ohne das LPWSTR() an, bei mir ruft das allerdings einen Konvertierungsfehler hervor.(Steht aber ja in der Argumentliste, dass er bei mir ein LPWSTR haben möchte).
Wie mache ich es richtig, so dass ich den kompletten Titel bekomme? Steige da noch nicht so ganz durch, was und wie da an GetWindowText() übergeben werden soll.veio
-
Und wenn Du unbedingt den Text eines -nicht zum aktuellen Thread gehörigen- Fensters haben willst, verwende WM_GETTEXT, evtl. noch WM_GETTEXTLENGTH
(falls dynamisch).
-
In Delphi komme ich mit GetWindowText() an alle Fenstertitel ran, dann sollte es in C++ doch auch gehen oder?
-
GetWindowTextA
-
Wow, es geht, danke
-
Oha, was ein Spaghetti-Code...better this way:
long lLen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); // if(!lLen) ... TCHAR* pszBuf = new TCHAR[++lLen]; SendMessage(hWnd, WM_GETTEXT, lLen, reinterpret_cast<LPARAM>(spzBuf)); // ... delete [] pszBuf;