Entwickler-Ecke

Windows API - Messages und wm_gettext


Payne85 - Di 25.11.03 15:40
Titel: Messages und wm_gettext
Hallo,
ich fange gerade an, mich mit der win api auseinanderzusetzen.
Also,ich hab mir schon die ganzen sachen mit send/get/peekmessage hier angeguckt,doch es half mir nicht wirklich weiter,genau wie das tutorial über die win32api. Naja, hier ein source schnipsel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var msg:TMsg;
begin
sendmessage(getactivewindow(),WM_GETTEXT,0,0);
getmessage(msg,0,0,0);
Translatemessage(msg);
Dispatchmessage(msg);
end;


Also hier fehlt sicher noch ne ganze menge aber ich will eigentlich nur den Fenstertitel auslesen (hab mein fenster zum testen genommen). Muss ich hier erstmal irgendwie eine Message Registrieren oder so? Und wie bekomme ich aus der variable msg den fenstertitel?
Wenn es leichter geht den Fenstertitel von irgendeinem fenster auszulesen wäre ich auch mit was anderem zufrieden. GetWindowText geht ja leider nicht.
Mfg

edit:
Alles klar habs jetzt doch hinbekommen :D
gut das man garkein getmessage nehmen muss


Delete - Di 25.11.03 18:33

Kuck dir mal die Parameeter von WM_GETTEXT an:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_gettext.asp

Und was soll das

Delphi-Quelltext
1:
2:
3:
getmessage(msg,0,0,0); 
Translatemessage(msg); 
Dispatchmessage(msg);

Noch danach?


Delphi-Quelltext
1:
2:
3:
4:
5:
var
  Buffer: array [0..255of Char;
begin
  SendMessage(hWnd, WM_GETTEXT, sizeof(Buffer), Integer(@Buffer));
  ShowMessage(String(Buffer));


Payne85 - Mi 26.11.03 14:22

Danke für dein Posting aber ich dachte man muss die Antwort von sendmessage immer mit einer Peek/getmessage einfangen. So hatte ichs verstanden.
"Und was soll das noch danach?" ->wie du sicher bemerkt hast habe ich mich noch nicht allzulange mit der Materie beschäftigt, aber gut das du so nett nachfragst. Ich hab ja wirklich respekt vor denen die, wie du, gut programmieren können, doch deswegen kann man doch "normal" nachfragen wieso ich das geschrieben hab. z.B. "Das hättest du garnicht machen müssen, weil..." Aber wahrscheinlich beantwortest du hier soviel fragen das du auf sowas keine lust mehr hast, naja schade. Vieleicht sehe ichs ja auch ganz falsch, will hier ja keinen ärger machen.
mfg


Delete - Mi 26.11.03 15:22

Payne85 hat folgendes geschrieben:
Danke für dein Posting aber ich dachte man muss die Antwort von sendmessage immer mit einer Peek/getmessage einfangen. So hatte ichs verstanden.

SendMessage ist eine Funktion, d.h. das Ergebnis kannst du direkt abfragen. Manchmal brauch man es, manchmal nicht. Ein gutes Beispiel ist dein "WM_GETTEXT", weil SendMessage hierbei nämlich die Anzahl der kopierten Zeichen zurückliefert, so dass du auch mit einem String arbeiten könntest:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
SetLength(s,MAX_PATH);
SetLength(s,SendMessage(GetActiveWindow,
  WM_GETTEXT,length(s),LPARAM(@s[1])));

ShowMessage(
  Format('"%s" hat %d Zeichen',[s,length(s)])
);

:)

Manchmal gibt´s auch Makros (bzw. Funktionen, in Delphi gemeint), mit denen solche SendMessage-Anweisungen gekapselt werden. Vorteil: du musst dich nicht mehr groß darum kümmern, wie die Parameter übergeben werden müssen, und du erhältst das Ergebnis meist gleich in der für dich interessanten Form. Und mal ehrlich,

Delphi-Quelltext
1:
ListView_SetSelectedColumn(hListview,1);                    

ist doch übersichtlicher als

Delphi-Quelltext
1:
SendMessage(hListview,LVM_SETSELECTEDCOLUMN,1,0);                    


Zitat:
"Und was soll das noch danach?" ->wie du sicher bemerkt hast habe ich mich noch nicht allzulange mit der Materie beschäftigt, aber gut das du so nett nachfragst. Ich hab ja wirklich respekt vor denen die, wie du, gut programmieren können, doch deswegen kann man doch "normal" nachfragen wieso ich das geschrieben hab. z.B. "Das hättest du garnicht machen müssen, weil..." Aber wahrscheinlich beantwortest du hier soviel fragen das du auf sowas keine lust mehr hast, naja schade. Vieleicht sehe ichs ja auch ganz falsch, will hier ja keinen ärger machen.

Nimm´s mir nicht übel, aber als ich damals mit dem API angefangen habe, da habe ich mir auch die erst mal ganzen Parameter angeschaut, damit ich weiß was ich überhaupt tun muss. Luckies damalige Tutorials waren dabei übrigens eine große Hilfe.
Und ich habe dir in einem anderen Beitrag doch den Link zu Luckies Seite und den aktuellen Tutorials gegeben. Wenn du dir das der Reihe nach anschaust (angefangen von den Fenstern bis hin zu ...), dann weißt du auch, wann man GetMessage und Co. verwendet. ;)

Ich verrate mal ein Geheimnis: auch, als ich schon etwas geübt im Umgang mit API-Programmen war, musste ich doch ab und zu nachschauen, weil ich die Syntax der WndProc:

Delphi-Quelltext
1:
2:
function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM):
  LRESULT; stdcall;

nicht unbedingt im Kopf hatte. :oops: Wie du siehst: jetzt ist das kein Problem mehr. :mrgreen:

Gruß.


Payne85 - Mi 26.11.03 15:35

Danke für deine Antwort,
ich hatte leider noch nicht die ausreichende zeit dazu, luckies tut durchzulesen, aber ich werds mir mal zu herzen nehmen.
Mfg