GetWindowRect - probleme
-
nabend ... oder morgen.
kann jetzt auch an der übermüdung liegen ... aber warum funktioniert folgender code nicht:
#include <iostream> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { tagRECT abc; GetWindowRect(&abc); system("PAUSE"); return 0; }

fehlermeldung:
cannot convert `tagRECT*' to `HWND__*' for argument `1' to `BOOL
komisch.
danke fürs durchlesen und guten morgen noch

-
ok .... ich sollte aufhören in diesem zustand zu coden ...

tagRECT abc; GetWindowRect(0 , &abc);das geht dann schon viel besser ... wer lesen kann is klar im vorteil ...

trotzdem krieg ich noch dumme werte raus ... irgendwas stimmt da immer noch net ... hier nochmal der code:
#include <iostream> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { tagRECT abc; GetWindowRect(0 , &abc); cout<<abc.bottom << endl; system("PAUSE"); return 0; }... wenn da jetzt nochmal so n dummer fehler wie eben drin steckt ... ich denk nochmal drüber nach wenn ich n bisl geschlafen hab

-
Gegenfragen:
a. warum verwendest du tagRECT wenn RECT erwartet wird, genauer LPRECT?
RECT abc; GetWindowRect(****Frage b.**** , &abc);b. warum übergiebst du als Fensterhandle eine 0, und nicht das Handle des fensters, wesen RECT du ermitteln willst?
Noch ne Zusatzfrage, warum schaust du nicht in der MSDN nach was diese Funktion erwartet, wenn du es aus dem FF nicht weißt?
EDIT: Ah jetzt ja eine Insel, du willst den RECT vom Desktop, oder?
..... GetWindowRect(NULL, &abc) .......
-
gut, hat sich erledigt. danke für den denkanstoß

zu a) keine ahnung, echt nicht. muss mich wohl verguckt haben ...
zu b) muss das irgendwie übersehen haben ... hab dann eben ne standart - null eingesetzt weil das schon öfter geholfen hat

^^
danke und schön sonntag!
-
MiC++ha schrieb:
EDIT: Ah jetzt ja eine Insel, du willst den RECT vom Desktop, oder?
..... GetWindowRect(NULL, &abc) .......ach übrigens der befehl dafür is:
HWND GetDesktopWindow(void.....erklärt sich glaube von selbs!damit kann man übrigens prim die höhe und breite des desktops herausfinden, das lohnt sich für fullscreen anwendungen!:
int main(void) { RECT r; GetWindowRect(GetDesktopWindow(),&r); printf("die Hoehe des Desktops: %d\nund die Breite:%d\n",r.bottom,r.right); return 0; }
-
@t.baum1
klar geht das so auch, aber wenn ich NULL angebe, also kein Handle, bei den Funktionen die ein HWND erwarten, niemmt Windows immer das erste und das ist der Desktop, daher funktionieren auch (fast) alle Funktionen damit.
Oder anders und "virtual" gesehen, ruft windows GetDesktopWindow() auf, wenn ich NULL angebe.
-
aso...na das is ja n knaller...^^ ich habs lieber n bischen unübersichtlicher!!*g*
danke trotzdem
-
Ich setze statt NULL immer die HWND_DESKTOP-Konstante ein

-
geeky schrieb:
Ich setze statt NULL immer die HWND_DESKTOP-Konstante ein

LOL
Klar ist sauberer, dann weißt man auf anhieb das der Desktop gemeint ist.
Probier mal folgendes aus:if (HWND_DESKTOP == NULL) MessageBox(NULL,"Aha ist NULL","Ises NULL?",MB_OK);Schreibfaule sparen sich halt 8 Zeichen und nehmen die NULL

-
Schreibfaule wundern sich dann auch, wenn ihre Programme unter der kommenden Windows-Version nicht funktionieren (beliebtes Stichwort: XXX_ALL_ACCESS).
Kannst Du garantieren, das auf Longhorn auch HWND_DESKTOP == NULL ist?
Ich glaube nicht! Und genau dafür gibt es jene Konstante...
-
Hepi schrieb:
Kannst Du garantieren, das auf Longhorn auch HWND_DESKTOP == NULL ist?
Ich glaube nicht! Und genau dafür gibt es jene Konstante...
Das hätte dann aber zur Folge, dass Longhorn nicht mehr abwärtskompatibel wäre, denn #define-Konstanten werden ja beim Compilieren ersetzt durch ihren Wert.

-
Winuser.h sagt:
#define HWND_DESKTOP (HWND)0Somit würden alle Programme die sowohl NULL oder (HWND)0 oder HWND_DESKTOP verwendet haben, auf Longhorn nicht laufen!
Welchen Sinn sollte es haben das dort ein anderer Wert ist?
-
Gegenfrage:
Wozu ist HWND_DESKTOP dann überhaupt da, wenn es doch nur eine zum HWND gecastete 0 ist?Und ich bleibe dabei:
Schreib ein Programm, was auf HKLM mittels KEY_ALL_ACCESS schreibend zugreift.Starte es unter Windows98.
Starte es als Administrator unter Windows 2000/XP.
Starte es als normaler Nutzer unter Windows 2000/XP.Was fällt uns auf?
Das Programm, was unter Windows98 vollkommen problemlos lief, tut's unter Windows 2000/XP nur noch mit Adminrechten. Und das alles nur, weil der Programmierer "schreibfaul" war und es bequem war, einfach KEY_ALL_ACCESS zu benutzen.
Es würde mich NICHT wundern, wenn HWND_DESKTOP unter Longhorn auf einmal 0x8000 wäre und GetWindowRect(NULL, &rc) rein gar nichts zurückliefert...
Denn, flenders, laufen würde das Programm nach wie vor; die Ergebnisse, die es liefert, wären aber undefiniert (wie bei KEY_ALL_ACCESS).
-
Ich nehme einfach das, was in der Doku steht - wenn dort sthet HWND_DESKTOP, dann nehme ich das, steht dort NULL, dann eben das. Diese Konstanten haben aber ja nicht nur den Sinn, variabel zu bleiben, sondern vielmehr, dass du dir keine Zahlenwerte merken musst

-
@Hepi
Du hast das nicht richtig verstanden.
Wenn ich z.B. GetDC(HWND_DESKTOP); schreibe so wandelt der Compiler es zu ne Null um und das Programm könnte das was er auf dem Desktop machen will nicht durchführen bei Longhorn wenn es dort 0x0800 ist, also müßte das Prog auf Longhorn mit der neuen SDK compiled werden. mein Medienplayer hat OSD welches durch GetDC(..)..etc. das auf dem Desktop ausgiebt, gut ich könnte das dann neu compilen, aber was ist mit den Leuten die meinen MediaPlayer verwenden?
Verstehst du den (Un)Sinn wenn es dann einen anderen Wert hat?KEY_ALL_ACCESS nutzt man um kompatibel zu sein, das hat aber nichts mit der defination des Desktop Handle zu tun, den egal ob ich HWND_DESKTOP oder NULL verwende, in der EXE steht immer die Null.