Autor |
Beitrag |
Toastbrotbaby
      
Beiträge: 98
|
Verfasst: Mo 01.11.10 15:04
Moin,
mein Problem ist folgendes.
Ich brauche schlichtweg nur einen "simulierten" Tastendruck.
Ich habe eine physikalisch umgebaute Maus. Diese kann sich nicht bewegen, aber es kann "geklickt" werden.
Es ist nun aber so, dass ich im Prinzip kein "klick" gebrauchen kann, sondern Pfeiltaste rauf, runter und Enter.
Wie sage ich nun also dem Programm, dass z.B. der Linke Mausbutton die Pfeiltaste hoch ist?!?
Greetz
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mo 01.11.10 16:27
Nun ja, sowas wie (pseudocode):
Delphi-Quelltext 1: 2: 3: 4:
| Case mouseButton of mbleft: sendkey(VK_ENTER); mbright: sendkey(VK_LEFT); ... |
Such mal nach SendKey, da sollte es Unmengen an Lösungen geben...
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: Mo 01.11.10 17:52
es gibt viel zu dem thema ... das ist richtig ...
ich habe mittlerweile die SndKey32 Unit eingebunden.
es lässt sich auch soweit durch den compiler jagen ...
defakto passiert nur nix wenn ich die maustasten drücke.
Es muss halt wirklich wie nen druck auf die pfeiltaste nach oben oder unten reagieren.
Ziel ist das ich durch die Buttons steppen kann wie mit der tastatur.
ich schau mal weiter. aber falls noch einer hier ne super idee hat, ich bin für alles offen
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mo 01.11.10 17:59
Wo rufst du denn Sendkey auf?
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: Mo 01.11.10 18:05
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin case button of mbleft: sendkeys('Up', true);
mbmiddle: sendkeys('Enter', true);
mbright: sendkeys('Down', true);
end; end; |
so sieht erstmal die prozedur des klickens aus ...
SndKey32 hab ich
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, SndKey32;
type |
dort mit drin.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mo 01.11.10 18:17
Sicher, dass man 'Enter' etc. verwenden kann?!?
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Mo 01.11.10 18:19
Schau dir das hier mal an: www.swissdelphicente.../showcode.php?id=220
Da sind auch Beispiele für die virtual keys (VK_MENU, VK_TAB, ...).
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: Mo 01.11.10 18:34
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| SendKeys('KeyString', Wait);
Any character that can be typed is supported. Surround the modifier keys listed above with braces in order to send as normal text.
Supported key names (surround these with braces):
BREAK CAPSLOCK CLEAR DEL DELETE DOWN END ENTER ESC ESCAPE
Function SendKeys(SendKeysString : PChar; Wait : Boolean) : Boolean; type WBytes = array[0..pred(SizeOf(Word))] of Byte;
TSendKey = record Name : ShortString; VKey : Byte; end;
const
MaxSendKeyRecs = 41; SendKeyRecs : array[1..MaxSendKeyRecs] of TSendKey = ( (Name:'BACKSPACE'; VKey:VK_BACK), (Name:'BKSP'; VKey:VK_BACK), (Name:'BREAK'; VKey:VK_CANCEL), (Name:'BS'; VKey:VK_BACK), (Name:'CAPSLOCK'; VKey:VK_CAPITAL), (Name:'CLEAR'; VKey:VK_CLEAR), (Name:'DEL'; VKey:VK_DELETE), (Name:'DELETE'; VKey:VK_DELETE), (Name:'DOWN'; VKey:VK_DOWN), (Name:'END'; VKey:VK_END), (Name:'ENTER'; VKey:VK_RETURN), (Name:'ESC'; VKey:VK_ESCAPE), (Name:'ESCAPE'; VKey:VK_ESCAPE), (Name:'F1'; VKey:VK_F1), (Name:'F10'; VKey:VK_F10), (Name:'F11'; VKey:VK_F11), (Name:'F12'; VKey:VK_F12), (Name:'F13'; VKey:VK_F13), (Name:'F14'; VKey:VK_F14), (Name:'F15'; VKey:VK_F15), (Name:'F16'; VKey:VK_F16), (Name:'F2'; VKey:VK_F2), (Name:'F3'; VKey:VK_F3), (Name:'F4'; VKey:VK_F4), (Name:'F5'; VKey:VK_F5), (Name:'F6'; VKey:VK_F6), (Name:'F7'; VKey:VK_F7), (Name:'F8'; VKey:VK_F8), (Name:'F9'; VKey:VK_F9), (Name:'HELP'; VKey:VK_HELP), (Name:'HOME'; VKey:VK_HOME), (Name:'INS'; VKey:VK_INSERT), (Name:'LEFT'; VKey:VK_LEFT), (Name:'NUMLOCK'; VKey:VK_NUMLOCK), (Name:'PGDN'; VKey:VK_NEXT), (Name:'PGUP'; VKey:VK_PRIOR), (Name:'PRTSC'; VKey:VK_PRINT), (Name:'RIGHT'; VKey:VK_RIGHT), (Name:'SCROLLLOCK'; VKey:VK_SCROLL), (Name:'TAB'; VKey:VK_TAB), (Name:'UP'; VKey:VK_UP) ); |
das ist grad mal ein auszug aus der SndKey32 Unit.
müsste doch reichen wenn ich die Unit in den Uses einbinde, oder muss ich noch die function angeben?!
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: Mo 01.11.10 19:23
Also mittlerweile fällt mir nix mehr ein ...
Neu getestet ist jetzt die Messages Unit.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.SendUp; var KeyInputs: array of TInput; KeyInputCount: Integer;
procedure KeybdInput(VKey: Byte; Flags: DWORD); begin Inc(KeyInputCount); SetLength(KeyInputs, KeyInputCount); KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD; with KeyInputs[KeyInputCount - 1].ki do begin wVk := VKey; wScan := MapVirtualKey(wVk, 0); dwFlags := KEYEVENTF_EXTENDEDKEY; dwFlags := Flags or dwFlags; time := 0; dwExtraInfo := 0; end; end; begin KeybdInput(VK_Return, 0); KeybdInput(VK_Return, KEYEVENTF_KEYUP); SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0])); end; |
getestet ...
selbes Problem. Es taucht keine Fehlermeldung auf, aber es gibt auch keine Reaktion.
Kann ja nicht angehen. Ich glaub ich zerleg gleich ne Tastatur, nur damit das funktioniert.
Muss doch wen geben der da noch ne Idee hat.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 01.11.10 19:55
Also Moment mal, welches Programm ist das denn überhaupt? Ich meine, wenn die Maus bei deinem Programm ankommt, dann kann doch gar kein anderes gerade aktiv sein.
Also wohin sollen die Eingaben gelangen? Zu deinem Programm oder woanders hin?
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: Mo 01.11.10 20:09
just and only im eigenen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 01.11.10 20:18
Das dachte ich mir schon...
Da brauchst du doch gar nichts weiter machen. Wenn du das Event bekommst, dass geklickt wurde, dann kannst du doch direkt so reagieren wie du es gerne hättest. Ich verstehe das Problem gar nicht. 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 01.11.10 20:50
Du willst Klicks auf dein eigenes Programmfenster simulieren? Warzum rufst du nicht einfach die Methoden auf?
|
|
|