Archiv verlassen und diese Seite im Standarddesign anzeigen : SendMessage
Delhpi-N00b
30.03.2002, 15:45
Hallo.
Könnt ihr mir bitte sagen was ich in dem Beispiel falsch mache?
procedure TForm1.Button2Click(Sender: TObject);
var
TheWindow : HWND;
begin
TheWindow := FindWindow(nil, ´Unbenannt - Editor´);
SendMessage(TheWindow,VK_RETURN,1,1);
end;
Ich habe in der SDK Hilfe nachgesehen und eine beschreibung der SendMessage Procedur gefunden:
LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
Wie definiere ich WPARAM und LPARAM korrekt? Ich habe in meinem Beispiel nur 1 eingetragen, weil ich nicht weiß was da hinkommt.
Könnt ihr mir helfen?
also 1. solltest du ueberpruefen ob TheWindow <> nil ist, ist dies der fall, so hat findwindow dein fenster nicht gefunden
bei sendmessage:
der parameter 1 hwnd ist klar
msg ist einfach die id der message (z.B. WM_CLOSE, ...)
und die restlichen 2 sind die parameter die uebergeben werden, diese unterscheiden sich von der art der message
also VK_RETURN ist lediglich eine konstante, wele die Enter Taste bezeichnet, aber keine Message, deshalb funktioniert es nicht
die botschaft, welche tastendruecke simmuliert ist WM_CHAR, und in WPARAM steht die taste welche gedrueckt wurde, in LPARAM glaube ich wird 0 die richtige wahl sein!
also:
SendMessage(TheWindow,WM_CHAR, VK_RETURN, 0);
so muesste das funkten, les dir zur sicherheit in des SDK das teil ueber WM_CHAR durch
Delhpi-N00b
30.03.2002, 18:47
Danke für die schnelle Erklärung, aber die Lösung geht nicht.
Das habe ich zu WM_CHAR gefunden:
The WM_CHAR message is posted to the window with the keyboard focus when a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR contains the character code of the key that was pressed.
Heisst das, dass ich zuerst die TranslateMessage funktion ausführen muß, damit meine Message übergeben werden kann?
Ich fange gerade an mich mit API auseinander zusetzen, tut mir leid wenn die Fragen dumm erscheinen sollten.
probier WM_KEYDOWN dann mal, und kannste mir den ganzen code schicken, weil dann koennte ichs testen
xOOn@coding-board.de
Diogenes
31.03.2002, 17:34
Tastendrücke werden mit wm_KeyDown simuliert. Windows macht den Rest.
Delhpi-N00b
01.04.2002, 01:32
Habe schon nach dem ersten Post WM_KEYDOWN ausprobiert, hat auch nicht geklapt. ;(
@xOOn
Habe dir den Quellcode geschickt, hoffe du kannst mir helfen.
@Diogenes
endlich kann ich dir mal wiedersprechen:
wm_KeyDown funkt zwar bei Ende, Pos1, (also Systemkeys) nicht aber bei einfachen tasten wie A, B, C, frag mich gedoch nicht warum, ka
fuer A, B, C geht dafuer aber WM_CHAR.
bei WM_CHAR wird jedoch KEIN ereignis KeyDown ausgeloest
@Delhpi-N00b
warum musstest du den fehler so gut verstecken X( X(
das Problem ist das Handle, mit
TheWindow := FindWindow(nil, ´Unbenannt - Editor´);
holst du dir zwar ein handle, aber das vom window und nicht das vom edit teil des notepads !!!
setzte die mouse in das editfeld vom Notepad
GetCursorPos (x);
TheWindow2 := WindowFromPoint (x);
und nimm dieses handle dann funkt es
korriegiert mich bitte wenn es falsch ist aber soviel wie ich weiss hat jedes von TWinControl abgeleitete Object ein eigenes handle
Diogenes
01.04.2002, 16:07
@x00n:
Tja... laß´mich raten: Du findest keine Virtual Keys (vk_Xxxx - Konstanten) für die echten Tasten?
Dann kann ich dir weiter helfen: Die VKs der echten Tasten sind mit ihern ASCII-codes identisch :D
@Diogenes
pech gehabt, 65=A und B=66 :D :D
naja funkt nicht der mag WM_KEYDOWN nicht, nichtmal wenn man ihm WM_KEYUP nachschickt, naja vieleicht wenn ich ne verzoegerung dazischen lege aber dann kann er ja 2 machen wenn die zu lange is!
Diogenes probiers doch selbst mal, nur es wuerde mich sehr erstaunen wenn es bei dir funken wuerde. ;) ;) ;)
Diogenes
01.04.2002, 20:50
Das werde ich darauf kannst Du ....lassen :D
Delhpi-N00b
02.04.2002, 15:02
@xOOn
Danke für die schnelle Antwort, ich will aber dass meine Anwendung selber Tastendrücke an Programme versendet, ohne dass ich mit der Maus auf das jeweilige Programm klicken muss.
Mit Winsight habe ich den Slassnamen von dem Editteil des Notepads rausgefunden: Edit.
Also habe ich mein Prog etwas umgeformt:
TheWindow := FindWindow(´Edit´,nil);
SendMessage(TheWindow,WM_CHAR, VK_RETURN, 0);
Aber es klappt immer noch nicht, hast du ein Vorschlag was ich da machen könnte?
naja genau das prob habe ich gestern mit Diogenes besprochen (naja der wahrheit halber ich habe gefragt und er hat geantwortet) und naja wir sind zum schluss gekommen dass es irgenwie moeglich sein muss! nur wie ist das problem, weil findwindow funktioniert nur bei top-level-handles (also fenster)!!
FindWindowEx scheint es zu koennen die frage ist nur ober er nur mdi windows mag oder auch andere objekte.
FindWindowEx (HandleVomNotepadFenster, 0, klasse des edit feldes, name des edit feldes);
Diogenes was sagst du dazu :mauer: :mauer: :mauer:
Diogenes
03.04.2002, 18:26
FindWindowEx kann fonktionieren - vorausgesetzt, man hat das Handle des Hauptfensters...
Ich fürchte allerdings, daß mit lpWindowName in Einem Edit-Klasse-Fenster der Fenstertext gemeint ist, also das was drinnen steht :mauer:
Man sollte sich also wirklich die Children enumerieren lassen...
Übrigens wm_KeyDown und wm_KeyUp simulieren eine virtuelle Tastatur. Die vk_Xxxx-Werte sind "ScanCodes", die erst durch die Verarbeitung in druckbare Zeichen (wm_Char, wm_DeadChar) umgewandelt werden. Also gilt: Für nicht-druckbare Zeichen wm_KeyDown nehmen, für druckbare wm_Char. Für Tasten und Zeichen, die zur Menüsteuerung verwendet werden, wm_SysZzzz verwenden. So Windows ist das! :rolleyes: (Herausgefunden durch Experimente auf Hex und lesen des WinCRT-Quellcodes!)
@Diogenes
also ich frage micht nicht wieso es so viele api funktionen gibt wenn nur 3 messages nahezu das selbe machen !!!
zu
FindWindowEx
naja vielleicht reicht es aus wenn man nur die klasse angibt und den namen null laesst
Hidioho!!
Ich hoffe ich habe alles richtig verstanden, wenn ja dann sollte euch mein Quellcode weiterhelfen ;)
FindWindow.rar (http://www.bi-di.de/downloads/FindWindow.rar)
MfG,
[23]
Ihr werdet euch vllt wundern warum ich folgendes gemacht habe:
function GetTitle (Hwnd: THandle; Param: Pointer): Boolean; stdcall;
[...]
GetWindowText (Hwnd, PChar (Text), 100);
SetLength(Text, Length(Form1.edt_Search.Text));
Form1.edt_Current.text := Text;
Ganz einfach.. versucht es ruhig mit ner Variable, es funktioniert ums verrecken nicht, obwohl da ja kein Unterschied ist, ob Variable oder EditX.Text, sehr seltsam....deshalb das Invisible edt_Current.Text......
naja, viel Spass beim rumprobieren ;)
Diogenes
05.04.2002, 13:56
@x00n: Ic fürchte, wir haben ein wenig aneinander vorbei geschrieben.
Zum Problem: Ich hoffe, daß [23] was brauchbares gemacht hat...Sein Pascal--Compiler versteht nämlich nur südost-allemansich und meiner mittelost-bairisch... :] Ich versteh´ kaum, was er sagt.
Was ich noch sagen wollte...
um das TMemo Feld aus dem Editor aufzählen zu lassen muss man die Funktion EnumChildWindows benutzen. Diogenes hat mich darauf hingewiesen dass ich die Sache wohl nicht ganz richtig verstanden habe und mein Quelltext dir nicht wirklich weiterhilft, allerdings erfüllt es den gleichen Zweck auf eine andere Art und Weise.
Gruss,
[23]
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.