Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tasten an Handle senden (https://www.delphipraxis.net/37153-tasten-handle-senden.html)

theomega 1. Jan 2005 15:49


Tasten an Handle senden
 
Hallo Leute,
ich verwende diese Funktion, um einen Tastendruck an ein Window zu senden:
Delphi-Quellcode:
procedure sendvk(vk:integer);
var wnd: HWND;
begin
  wnd := FindWindow('{DA7CD0DE-1602-45e6-89A1-C2CA151E008E}', nil);
  if wnd <> 0 then
  begin
    PostMessage(wnd, WM_KEYDOWN, vk, 0);
  end;
end;
aufgerufen wird das dann mit z.b.
Delphi-Quellcode:
sendvk(ord('V'));
Funktioniert auch problemlos, das problem ist: Ich will nichtnur einfache Tastendrücke (wie in dem Fall 'V' simulieren, sondern auch ALT+V. Wie geht das?

Danke
TO

Christian Seehase 1. Jan 2005 15:55

Re: Tasten an Handle senden
 
Moin The Omega,

dann musst Du, um bei Deinem Beispiel zu bleiben, erst einmal das Drücken von ALT, dann das Drücken von V, dann das Loslassen von V, und anschliessend das Loslassen von ALT senden.

theomega 1. Jan 2005 16:01

Re: Tasten an Handle senden
 
das hatte ich auch schon probiert, alledings auch nicht hinbekommen:
Delphi-Quellcode:
    PostMessage(wnd, WM_KEYDOWN, VK_SHIFT, 0);
    PostMessage(wnd, WM_KEYDOWN, ord('V'), 0);
zu einen WM_KEYUP komm ich garnicht, die Anwendung reagiert sofort und zwar mit einen V und nicht einen SHIFT+V.
Hatte mich oben vertippt, ich will kein ALT+V sondern ein Shift+V. Das ganze dient zum fernsteuern eines Mediaplayers!

Danke schonmal
TO

SirThornberry 1. Jan 2005 16:05

Re: Tasten an Handle senden
 
wie löst du das ganze aus? über einen Buttonclick? wenn ja versuchs mal per timer ansonsten ist ja die maustaste zu dem zeitpunkt gedrückt was das ganze beeiflussen kann

Christian Seehase 1. Jan 2005 16:06

Re: Tasten an Handle senden
 
Moin The Omega,

Zitat:

Zitat von theomega
zu einen WM_KEYUP komm ich garnicht,

wieso?
Wenn Du die Message mit PostMessage verschickst läuft Dein Programm doch weiter.
Das das andere Programm halt schon beim Drücken, von SHIFT-V reagiert, und nicht erst beim Lösen kann damit eigentlich nichts zu tun haben, und dürfte sich auch nicht beeinflussen lassen.

theomega 1. Jan 2005 16:09

Re: Tasten an Handle senden
 
also, ich löse das ganze per button aus, und das empfangende programm scheint nicht zu merken, dass shift auchnoch gedrückt ist und statt zum vorherigen song (SHIFT+V) zu springen, springt es zum nächsten (V). Un ob ich jetzt noch ein KEYUP mache oder nicht ändert garnichts an der Situation!

Christian Seehase 1. Jan 2005 16:13

Re: Tasten an Handle senden
 
Moin The Omega,

merkwürdig.
Dafür fällt mir jetzt so keine Lösung ein. :gruebel:

theomega 1. Jan 2005 16:16

Re: Tasten an Handle senden
 
mir erschien die sache auch nicht logisch so, weil: damit werden doch nacheinander die tastendrück simuliert. Und vermutlich sag sich das programm als erstes: "Aha, ein shift, aber damit fang ich wenig an" und dann kommt das V rein und das Programm macht das, was das V normalerweise tut! Ich denke das wird nicht gleichzeitig gemacht!

SirThornberry 1. Jan 2005 16:24

Re: Tasten an Handle senden
 
es liegt mit gaaaaaaaaanz hoher wahrscheinlichkeit an dem buttonclick. Du sendest mit PostMessage die Shifttaste, als nächstes wird der focus wieder an dein Programm gegeben (weil maus down) und somit ist die aktion abgeschlossen. Du könntest versuchen die Tasten verzögert per timer zu senden (wenn die maustaste auf deinem button nicht mehr down ist) oder das ganze mal mit SendMessage versuchen

theomega 1. Jan 2005 17:23

Re: Tasten an Handle senden
 
gut, also ich hab ein bischen rumprobiert: postmessage oder sendmessage macht keine unterschied. Ob Button oder Timer macht auch keinen!
ich habe dann noch diesen Code hier konstruiert, der hilft aber auch nicht!
Delphi-Quellcode:
procedure prev();
var wnd: HWND;
KeyBrdSt : TKeyboardState;
begin;
  wnd := FindWindow('{DA7CD0DE-1602-45e6-89A1-C2CA151E008E}', nil);
  if wnd <> 0 then
  begin
    GetKeyboardState( KeyBrdSt );
    KeyBrdSt[ VK_SHIFT ] := $80;
    SetKeyboardState( KeyBrdSt );
    SendMessage(wnd, WM_KEYDOWN, ord('V'), 0);
    KeyBrdSt[ VK_SHIFT ] := $00;
    SetKeyboardState( KeyBrdSt );
  end;
end;
hat sonst noch jemand nen guten tip?

Danke
TO


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz