Autor |
Beitrag |
Kri
      
Beiträge: 118
|
Verfasst: Sa 12.04.08 14:56
Hallo zusammen,
ich habe mir diesen Quelltext genommen:
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: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:
| procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState; specialkey: Boolean);
type TBuffers = array [0..1] of TKeyboardState; var pKeyBuffers: ^TBuffers; lParam: LongInt; begin if IsWindow(hWindow) then begin pKeyBuffers := nil; lParam := MakeLong(0, MapVirtualKey(key, 0));
if specialkey then lParam := lParam or $1000000;
New(pKeyBuffers); try GetKeyboardState(pKeyBuffers^[1]); FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);
if ssShift in shift then pKeyBuffers^[0][VK_SHIFT] := $80; if ssAlt in shift then begin pKeyBuffers^[0][VK_MENU] := $80; lParam := lParam or $20000000; end; if ssCtrl in shift then pKeyBuffers^[0][VK_CONTROL] := $80; if ssLeft in shift then pKeyBuffers^[0][VK_LBUTTON] := $80; if ssRight in shift then pKeyBuffers^[0][VK_RBUTTON] := $80; if ssMiddle in shift then pKeyBuffers^[0][VK_MBUTTON] := $80;
SetKeyboardState(pKeyBuffers^[0]); if ssAlt in Shift then begin PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam); PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000); end else begin PostMessage(hWindow, WM_KEYDOWN, key, lParam); PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000); end; Application.ProcessMessages;
SetKeyboardState(pKeyBuffers^[1]); finally if pKeyBuffers <> nil then Dispose(pKeyBuffers); end; end; end; |
und
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); var targetWnd: HWND; begin targetWnd := FindWindow('notepad', nil) if targetWnd <> 0 then begin PostKeyExHWND(targetWnd, Ord('A'), [], False); end; end; |
Dann öffne ich das Notepad, aber es passiert nicht?
Ich denke, dass mein targetwnd falsch ist.
Weiss einer Rat?
Viele liebe Grüße
Kri
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Sa 12.04.08 15:07
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Kri 
      
Beiträge: 118
|
Verfasst: Sa 12.04.08 15:16
Das Fenster heisst "Neu Texdokument - Editor" (ohne txt);
Habe nun ausprobiert ohne Erfolg:
notepad
notepad.exe
Neu Textdokument.txt
Neu Textdokument.txt - Editor
Neu Textdokument - Editor
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 13.04.08 10:57
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Kri 
      
Beiträge: 118
|
Verfasst: So 13.04.08 11:37
Hi,
hab sogar die einzelnen "Window-Titles" ausgelesen, bei mir ist da kein txt..
Ich habe das Programm man aus Jux in Counterstrike getestet, da funktioniert es..
Aber im Notepad nicht..
Was meinst du mit Breakpoint?
Viele liebe Grüße
Kri
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 13.04.08 12:49
Kri hat folgendes geschrieben: |
Was meinst du mit Breakpoint? |
wenn du vor der Zeile (wo die Nummern stehen) klickst, wird die entsprechende Zeile farblich markiert. Läuft das Programm irgendwann mal da durch, hält es an und du siehst, was so los ist => wenn du die von mir markierte Zeile als Breakpoint setzt und das Programm nie anhält, dann findet er das Fenster nicht, anders allerdings funktioniert irgendwas andres nicht.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Kri 
      
Beiträge: 118
|
Verfasst: So 13.04.08 13:26
Hi,
ok das habe ich gemacht, es gab keinen Fehler (ist so ein grüner Haken durch)..
Viele liebe Grüße
Kri
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 13.04.08 15:01
Kri hat folgendes geschrieben: |
(ist so ein grüner Haken durch)
|
ein Bild sagt mehr als tausend Worte ^^
Anmerkung: Aus dem ganzen habe ich gesehen, dass er das Fenster findet (als 'notepad'). Es muss also was an deiner Procdure PostKeyExHWND nicht stimmen.
//Edit: ich vermute mal, du musst den Wert an das Textfeld schicken, nicht an Notepad selbst
Einloggen, um Attachments anzusehen!
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 13.04.08 15:14
Hm nachdem ich das jetzt 2 Tage beobachtet habe, verrate ich euch doch mal die Lösung  Nein Spaß, ich hab mir das auch eben erst richtig angesehen.
Die Fensterliste vom Simon Reinhard ist wirklich praktisch. Und zwar ist das Eingabefeld im Notepad das Control, an das die Nachricht gehen müsste. Also:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| targetWnd := FindWindow('Notepad', nil); if targetWnd <> 0 then begin targetWnd:= GetWindow(targetWnd,GW_CHILD); PostKeyExHWND(targetWnd, Ord('A'), [], False); end; |
Im Findwindow das war übrigens richtig: der erste Parameter ist die Fensterklasse, und die ist tatsächlich 'Notepad'. Davon hole ich mir das erste Unterfenster. Nachricht hin, und fertig 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Kri 
      
Beiträge: 118
|
Verfasst: So 13.04.08 20:15
Hi,
oh Wunder es geht endlich.
Vielen Dank an dieser Stelle!
Viele liebe Grüße
Kri
|
|
|