| Autor |
Beitrag |
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 21.02.09 00:02
ich will in einem fremden programm einen tastendruck simulieren
u.a. ESC, TAB, F1-F9, 0-9
ich hab es so versucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| taste:=VK_ESCAPE; ...
lParam := MapVirtualKey(taste, 0); lParam := lParam shl 16+1;
hwnd:=...;
PostMessage(hwnd,WM_KEYDOWN,taste,lParam); PostMessage(hwnd,WM_KEYUP,taste,lParam and $C0000000); |
leider funktioniert es so nicht immer, bzw bekomme ich seltsame ergebnisse:
bei ESC macht er zwar die aktion, die er machen sollte, reagiert aber dann nicht mehr auf (manuelles) F1-F9 bis zum manuellen drücken von ESC
TAB ignoriert er
F1-F9 und 0-9 gehen
kann es sein, dass das Fenster an dass die Nachricht gehen muss nicht das Hauptfenster ist, sondern ein (unsichtbares) Unterfenster?
Ich habe welche gefunden mit Namen: "M" und "Default IME"
was sind das für welche?
müssen wparam/lparam vl anders sein?
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 21.02.09 18:44
es klappt wenn ich die WM_KEYUP message bei spezialtasten weglasse...
sehr seltsam
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Sa 21.02.09 20:03
[quote=" Flamefire"(550547) Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| taste:=VK_ESCAPE; ...
lParam := MapVirtualKey(taste, 0); lParam := lParam shl 16+1;
hwnd:=...;
PostMessage(hwnd,WM_KEYDOWN,taste,lParam); PostMessage(hwnd,WM_KEYUP,taste,lParam and $C0000000); | [/quote]
Hab den Aufbau grad nicht so genau im Kopf.. aber wofür isn das da?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 21.02.09 20:34
Die Variable taste hat einen Wert im Bytebereich (Virtual Keys eben). Es sind also nur diese Bits gesetzt maximal: Quelltext 1:
| 00000000 00000000 00000000 11111111 | MapVirtualKey ergibt auch einen solchen Wert im Bytebereich AFAIK, denn du übergibst ja 0, also MAPVK_VK_TO_VSC, und Scancodes sind auch im Bereich 0..255.
Durch das shl 17 sind das dann diese Bits: Quelltext 1:
| 00000001 11111110 00000000 00000000 | Jetzt kommt das lParam and $C0000000: Quelltext 1: 2: 3:
| 00000001 11111110 00000000 00000000 and $C0000000 = 11000000 00000000 00000000 00000000 | Das ist immer 0, weil die gesetzten Bits niemals überlappen können. Du übergibst dort also immer 0, warum also das and?
Laut Dokumentation steht der Scancode bei den Botschaften in lParam ab Bit 16, du verschiebst eins zu viel (um 17).
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 21.02.09 21:50
ähm...ich habe "shl 16" nicht "shl 17"
und das mit dem AND stimmt
eine addition funktioniert
außerdem muss lParam vom typ Cardinal sein, nicht Word
das $c0000000 ist dafür da, damit die ersten 2 bits gesetzt sind (cRepeat und noch so was was gesetzt sein muss)
mich wundert aber, dass es durch weglassen von WM_KEYUP funktioniert
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 21.02.09 22:24
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: So 22.02.09 00:42
Ich kapier zwar grad nicht genau worum es geht..
Flamefire hat folgendes geschrieben : | | ähm...ich habe "shl 16" nicht "shl 17" |
sicher?
Delphi-Quelltext 1:
| lParam := lParam shl 16+1; |
weiß grad nicht, in welcher Reihenfolge das ausgeführt wird.
Aber setz das vielleicht mal in Klammern?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 22.02.09 01:17
Wie ich dann korrigiert habe: Von links nach rechts, denn beide Operatoren binden genauso stark. Das ist also richtig mit Shift um 16.
|
|
|