Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Alt Gr simulieren
Mortal-Shadow - Do 27.11.08 11:54
Titel: Alt Gr simulieren
Hi,
ich bin dabei mittels keybd_event() Tasten an ein anderes Programm zu senden. Klappt soweit ganz gut, nur bei der Eingabe eines '\' habe ich Probleme.
Leider funktioniert es nicht die Eingabe per Strg + Alt Taste zu machen.
Lediglich mit Alt Gr. Das Programm unterscheidet irgendwie dazwischen.
Bei meiner Suche, fand ich allerdings immer nur den Hinweis es über Alt + Strg zu versuchen.
Daher nun diese Topic.
Mfg,
MS.
Delete - Do 27.11.08 12:01
Versuch es doch mit ALT-92.
Mortal-Shadow - Do 27.11.08 12:04
Wie meinst du das: Alt-92?
Wie sieht der Wert aus den ich Keybd_event() mitgebe?
Alt oder VK_Menu hat ja den Wert 18.
keybd_event(18-92,18-92,0,0) ergäbe somit keinen Sinn.
Mortal-Shadow - Do 27.11.08 16:57
So was ähnliches habe ich mir auch schon selber gebaut.
Das löst aber mein Problem nicht.
Denn diese Prozedure entertext(); bildet ebenfalls Alt Gr mittels Strg+Alt nach.
Dies führt edoch bei dem Programm dem ich die Tasten schicke zu Problemen.
(Vgl: Taskmanager startet auch nur mit Strg+Alt+Entf und nicht mit Alt Gr + Entf - ein Unterschied besteht also definitiv.)
Ich suche somit eine Zahl die ich keybd_event mitgeben kann für AltGr.
Mfg.
Delete - Do 27.11.08 17:18
Versuch es mal mit VK_RMENU.
Mortal-Shadow - Do 27.11.08 17:42
Hab ich schon, wird leider wie ein normaler Druck auf die Alt-Taste angesehen :-(
Delete - Do 27.11.08 17:52
Merkwürdig, bei mir bewirkt VK_RMENU + 219 die Eingabe eines Backslash.
Mortal-Shadow - Do 27.11.08 17:59
Delphi-Quelltext
1: 2: 3: 4:
| keybd_event(VK_RMENU,VK_RMENU,0,0); keybd_event(219,219,0,0); keybd_event(219,219,KEYEVENTF_KEYUP,0); keybd_event(VK_RMENU,VK_RMENU,KEYEVENTF_KEYUP,0); |
Funktioniert bei mir nicht.
Zum Vergleich:
Delphi-Quelltext
1: 2:
| keybd_event(189,189,0,0); keybd_event(189,189,KEYEVENTF_KEYUP,0); |
erzeugt ein '-'.
:?:
Delete - Do 27.11.08 18:01
Delphi-Quelltext
1: 2: 3: 4:
| keybd_event(VK_RMENU, 0, 0, 0); keybd_event(219, 0, 0, 0); keybd_event(219, 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0); |
Mortal-Shadow - Do 27.11.08 18:04
Gerade Ausprobiert: Funktioniert leider auch nicht.
PS: Ich will so etwas in ein Editfeld schreiben - gibt es da vielleicht eine andere Möglichkeit, falls ich es mit keybd_event nicht hinkriege?
Delete - Do 27.11.08 18:06
Ich hab das auch in ein Edit geschrieben. Mach mal ein Edit.SetFocus direkt vor den von mir geposteten Code.
Mortal-Shadow - Do 27.11.08 18:12
Naja, dass Problem ist, dass dieses Edit zu einem anderen Programm gehört.
In ein normales Edit, dass ich mir selbst erstellt habe in ner Delphi Form geht es gut.
Und ja, das Edit hat ein Focus.
Buchstaben z.B. werden ja dargestellt.
Und ich hab auch manuell versucht '\' mittels strg+ alt zu schreiben, was nicht ging.
Das Programm reagiert leider gesondert auf die strg-Taste.
Tilman - Do 27.11.08 18:16
Mortal-Shadow hat folgendes geschrieben : |
Gerade Ausprobiert: Funktioniert leider auch nicht.
PS: Ich will so etwas in ein Editfeld schreiben - gibt es da vielleicht eine andere Möglichkeit, falls ich es mit keybd_event nicht hinkriege? |
Naja das zeichen in die Zwischenablage kopieren und per Strg+V raushauen wäre noch ne Alternative wenns nicht anders geht.
// edit: naja geht natürlich doch nicht, da ja die STRG-Taste gesondert verwertet wird... hm keine ahnung ^^
Delete - Do 27.11.08 18:48
Und per WM_SETTEXT?
Mortal-Shadow - Do 27.11.08 19:38
Also wenn ich google richtig verstanden habe^^ meinst du damit so etwas:
Delphi-Quelltext
1:
| SendMessage(handle, WM_SETTEXT, 0, Integer(PChar('Mein Text mit \'))); |
Nur: wie kriege ich das handle einer fremden Anwendung?
Yogu - Do 27.11.08 21:15
Suche mit
FINDWINDOW das Formular (du kannst dort nach dem Fenstertitel suchen), und wähle die Komponente mit
FINDWINDOWEX. Dann bekommst du das Handle, welchem du eine Message schicken kannst.
Mortal-Shadow - So 30.11.08 09:41
Ok, sry, ich war ne Weile nicht da, habe es jetzt aber mal ausprobiert.
Das Fenster über seinen Namen finden, klappt gut mittels Findwindow().
Aber bei FindwindowEx() habe ich einige Probleme.
Delphi-Quelltext
1:
| wndchild := findwindowex(wndparent,0,'TEdit',nil); |
wndchild ist leider immer 0.
Ich habe es zur sicherheit auch mit anderen vorhandenen Klassen versucht - z.B. TComboBox oder TLabel, die jedoch alle nicht gefunden wurden.
Lediglich mit
Delphi-Quelltext
1:
| wndchild := findwindowex(wndparent,0,nil,nil); |
ist wndchild <> 0.
Kann ich so irgendwie Rückvollziehen was für Klassen da benutzt werden um ihre Handles zu kriegen?
Ich habe es bereits mittels
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var lBuffer: String; lSize : Integer; begin SetLength(lBuffer, 255); lSize := GetWindowText(Handle, @lBuffer[1], Length(lBuffer)); Memo1.Text := copy(lBuffer, 1, lSize); |
versucht.
Wenn ich wndparent als Handle genommen habe, kam (korrekterweise) der Name der Form des Programms.
Wenn ich wndchild mit wndchild := findwindowex(wndparent,0,nil,nil); versucht habe, dann bekam ich den Namen der .exe des Programms (einschlieslich exe-Endung). :?
Mfg,
MS.
jaenicke - So 30.11.08 15:42
Dieses und ein ähnliches Tool habe ich doch schon verlinkt ;-).
Und dein Link führt zu einer ziemlich alten Version, die neue kann einiges mehr.
Yogu - So 30.11.08 15:46
jaenicke hat folgendes geschrieben : |
Dieses und ein ähnliches Tool habe ich doch schon verlinkt ;-).
Und dein Link führt zu einer ziemlich alten Version, die neue kann einiges mehr. |
Oh, das hab ich ganz übersehen. Und ich habe auch nur schnell nach WinSpy gegoogelt, ohne lang reinzuschauen. :oops:
Mortal-Shadow - So 30.11.08 15:57
Also, erstmal danke für das Programm.
Scheint wirklich nütlich zu sein.
Aber es klappt trotzdem nicht -.- .
Ich hab mir das Script zum Handle finden erzeugen lassen und auch überprüft (heißt: das handle in ein memo geschrieben und die Zahl mit der Ausgabe des parallel laufenden WinSpys verglichen.)
Die stimmen auch überein, 'wndchild' scheint also korrekt zu sein.
Aber mit
Delphi-Quelltext
1:
| SendMessage(wndChild, WM_SETTEXT, 0, Integer(@meintext[1])); |
passiert rein gar nichts.
Warum?
Yogu - So 30.11.08 18:03
Mortal-Shadow hat folgendes geschrieben : |
Delphi-Quelltext 1:
| SendMessage(wndChild, WM_SETTEXT, 0, Integer(@meintext[1])); | |
Versuche mal, den Text als
PCharY zu übergeben:
Delphi-Quelltext
1:
| SendMessage(wndChild, WM_SETTEXT, 0, Integer(PChar(meintext))); |
Mortal-Shadow - So 30.11.08 21:48
Hmmmm sehr seltsam.
PChar ging nicht, also habe ich mich entschlossen nach einem Fehler zu suchen, indem ich es bei einem anderen Programm versuche.
Ein anderes von mir in Delphi geschriebenes Programm konnte ich verändern, also versuchte ich in das Suchfeld meines Firefox-browsers zu schreiben.
Dies wiederum ging nicht :x .
Mir ist auch aufgefallen, dass wenn ich den Text eines Editfeldes auf einer unkompilierten Delphi-Form verändere, er sich im Objectinspektor nicht anpasst.
Vielleicht hat das was miteinander zu tun.
Ich muss sagen, dass ich durch den fehlschlag bei Firefox und Erfolg bei der Delphi-Anwendung total verwirrt bin.
Ich hoffe das klärt sich :?
jaenicke - So 30.11.08 22:24
Nun ja, manche Anwendungen / Controls reagieren auf die Botschaft nicht, manchmal aus Sicherheitsgründen, manchmal aus anderen Gründen. Beim Firefox könnte der Grund sein, dass er plattformübergreifend geschrieben ist, und solche Botschaften gibt es ja nur unter Windows.
Mortal-Shadow - So 30.11.08 22:31
-.-
Hört sich ja Klasse an.
Und wie krieg ich jetzt mein '\' in das edit?
jaenicke - So 30.11.08 22:36
Um welches Programm handelt es sich? Kann man es vielleicht irgendwo herunterladen? Das würde es etwas einfacher machen.
Mortal-Shadow - So 30.11.08 22:48
In diesem Fall um das Programm 'Avidemux'.
Ist ein konverter zwischen verschiedenen Musiktypen, den ich automatisieren
und dabei ein wenig über die Möglichkeiten von Delphi lernen wollte.
Mortal-Shadow - Di 02.12.08 19:48
Hmmm, keiner eine Idee?
Ist es vielleicht unmöglich?
Delete - Di 02.12.08 19:53
Welches Edit ist es denn?
Mortal-Shadow - Di 02.12.08 20:04
Beim Datei Speichern die Pfadangabe
jaenicke - Di 02.12.08 20:37
Es wäre vielleicht am sinnvollsten, wenn du mal zeigst was du hast, ich sehe nicht was ich machen muss, damit das Edit was du meinst angezeigt wird. (Bzw. habe auch wenig Lust das Programm dafür selbst auszuprobieren. ;-))
Mortal-Shadow - Mi 03.12.08 23:35
Mir mit meinem Programm automatisch zu formatierende Musik/Videos erkennen, dann shellexecute(Avidemux) und von dort aus versuchen das Programm zu öffnen und zu bearbeiten + speichern.
Allerdings braucht öffnen + Speichern eine Pfadangabe. Und die enthält nun mal einen '\'.
Und den will ich irgendwie simulieren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!