Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Explizites tasten event auslösen (https://www.delphipraxis.net/149760-explizites-tasten-event-ausloesen.html)

gibb 29. Mär 2010 18:07


Explizites tasten event auslösen
 
Hallo zusammen,

Ich mache folgendes:
Delphi-Quellcode:
procedure TSFontroler.UpdateFanSpeed(AFan : TFanOverlayObject);
var
  HWNDControl : HWND;
  i:Integer;
  wparam: smallint;
  strNewSpeed:String;
begin
  HWNDControl:= getControlHandle(AFan.ControleNumber);
  if Afan.NewSpeed <> -1 then begin
    if HWNDControl <> 0 then begin
      PostMessage(HWNDControl, WM_KEYDOWN, 46,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 46, 0); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 46,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 46, 0); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 46,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 46, 0); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 8,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 8, 0); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 8,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 8, 0); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 8,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 8, 0); // Delete taste rauf
      strNewSpeed:= inttostr(AFan.NewSpeed);
      GPModLog.AddToLog('Speddfancontrole: fan'+ AFan.overlayName + ': ' + strNewSpeed );

      For i:= 1 to Length(strNewSpeed) do begin
        wparam:= MapIntToKey(strNewSpeed[i]);
        PostMessage(HWNDControl, WM_KEYDOWN, wparam,0); // Ctrl runter
    //    PostMessage(HWNDControl, WM_KEYUP , wparam, 0); //  Taste runter
      end;
    end;
  end;
end;

Function TSFontroler.MapIntToKey(akey: String) : Smallint;
begin
  Case StrToInt(akey) of
    0: Result:= 48;
    1: Result:= 49;
    2: Result:= 50;
    3: Result:= 51;
    4: Result:= 52;
    5: Result:= 53;
    6: Result:= 54;
    7: Result:= 55;
    8: Result:= 56;
    9: Result:= 57;
  End;
end;
So, der grund wieso postmessage mit dem keyUp event auskommentiert ist das der mir immer noch einmal eine Zahl hinzufügt. Scheint irgendwie mit dem lparam zusammen zu hängen... obwohl ich das nicht ganz verstanden habe was da sonst mit muss...

Ausserdem habe ich festgestellt das wenn ich das keyUp event weglasse und ich ctrl oder schift gedrückt halte auf der tastatur es diese messegas auch beinflusst... leider. Lässt sich das irgendwie umgehen? denn das programm läuft im hintergrund mit einem interval von 3 sec und jedesmal machts bing wenn ich die ctrl taste gedrückt halte :drunken:

Tja jetzt meine frage an euch 1. was sollte da bei lparam mit damit er mir nicht jedesmal beim keyup nochmal ein zeichen hinzufügt?
2. Was kann ich machen damit ctrl&co ignoriert wird?

Danke und Gruss
GIBB

gibb 30. Mär 2010 11:18

Re: Explizites tasten event auslösen
 
Hallo

Keiner ne idee? mir währe es extrem wichtig zu wissen wie ich den einfluss von ctrl/Shift und andere dinge die manuell getätigt werden auf meine events unterbinden kann.

Das nervt wirklich ungemein... und ist sozusagen betriebsverhindernd.

Gruss GIBB

shmia 30. Mär 2010 14:52

Re: Explizites tasten event auslösen
 
Versuchs doch mal mit der Unit SndKeys32: http://www.delphi3000.com/articles/article_1617.asp

gibb 30. Mär 2010 16:59

Re: Explizites tasten event auslösen
 
Hi,
Danke für die anttwort. Leider hilft Sie mir nichts da ich die message direkt in ein spinedit einer anderen applikation sende. Das geht mit deiner Funktion leider nicht.
Nichtsdestotrotz danke vielmals. Hab mich gerade gefragt ob ich nicht irgendwie feststellen könnte ob zur Zeit gerade shift gedrückt ist und wenn ja dies schnell für 1ms deaktivieren und wieder aktivieren könnte.

Weitere Vorschläge her ;)

Gruss gibb

shmia 30. Mär 2010 18:14

Re: Explizites tasten event auslösen
 
Also die Taste Control-S müsste doch so aussehen:
Delphi-Quellcode:
const
  LPARAM_KEYUP = $C000; // Bit 31 & 30 gesetzt wie bei WM_KEYUP vorgeschrieben

PostMessage(HWND, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(HWND, WM_KEYDOWN, Ord('S'), 0);
PostMessage(HWND, WM_KEYUP, Ord('S'), LPARAM_KEYUP);
PostMessage(HWND, WM_KEYUP, VK_CONTROL, LPARAM_KEYUP);
Bringt dich das vielleicht weiter?

gibb 30. Mär 2010 18:25

Re: Explizites tasten event auslösen
 
Hi, naja ganz verkehrt ist es nicht ^^'

aber ich will ja das NICHT controle und NICHT shift gedrückt ist wenn ich ne tasten eingabe mache... aber ev. hast du recht was der erste teil betrifft. Da ich zur zeit gerade mit ner trial version programmiere hab ich die hilfe nicht.

werds aber testen. ev wenn lparam stimmt dann hat er auch nicht mehr das gefühl das shift gedrückt ist. Mein kleiner hoffnungsschimmer ;)

Gruss gibb

gibb 3. Mai 2010 16:22

Re: Explizites tasten event auslösen
 
mhmm, ich habe immer noch ein ungelöstes problem.

und zwar ctrl und die "^" taste haben dieselbe auswirkung wie die shift. Ich habe jetzt um das mit der shift taste zu umgehen einfach die werte vom Zahlenpad genommen. (die die mit numlock aktiviert werden) das funktioniert zwar bei shift aber beim resten noch nicht.

Also was mache ich das bei postmessage das useringaben ignoriert werden?

Gruss gibb

gibb 4. Mai 2010 10:35

Re: Explizites tasten event auslösen
 
Hi,

irgendwie scheint für dieses problem niemand eine lösung zu kennen. Nun Folgende Idee was passiert wenn jemand gerade im word am schreiben ist und shift gedrückt hält, und ich immer ein keyup shift, ctrl usw. sende? Das wird ja nur an diesen handle gesendet oder?

gruss Sev

idefix2 4. Mai 2010 12:16

Re: Explizites tasten event auslösen
 
Wenn Du unmittelbar hintereinander "shift loslassen", "Taste drücken", "Taste loslassen", "shift loslassen" schickst, sollte eigentlich nichts unerwümschtes passieren.

Es gibt übrigens die Funktion "sendinput", mit der eine Reihe von Tastatutereignissen mit einem einzigen API-Aufruf in die Messagequeue gestellt werden können, die sollten dann wirklich in jedem Fall unmittelbar hintereinander in der Queue stehen.


Nebenbei: Wäre statt
Delphi-Quellcode:
  Case StrToInt(akey) of
    0: Result:= 48;
    1: Result:= 49;
    2: Result:= 50;
    3: Result:= 51;
    4: Result:= 52;
    5: Result:= 53;
    6: Result:= 54;
    7: Result:= 55;
    8: Result:= 56;
    9: Result:= 57;
  End;
nicht einfacher
Delphi-Quellcode:
 Result := StrToInt (akey) + 48;

gibb 4. Mai 2010 12:26

Re: Explizites tasten event auslösen
 
hi, hab das jetzt folgendermassen gelöst:
Delphi-Quellcode:
procedure TSFontroler.UpdateFanSpeed(AFan : TFanOverlayObject);
var
  HWNDControl : HWND;
  i:Integer;
  wparam: smallint;
  strNewSpeed:String;
begin

  HWNDControl:= getControlHandle(AFan.ControleNumber);
  if Afan.NewSpeed <> -1 then begin
    if HWNDControl <> 0 then begin
      PostMessage(HWNDControl, WM_KEYDOWN, 46,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 46, $C000); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 46,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 46, $C000); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 46,0); // Delete taste runter
      PostMessage(HWNDControl, WM_KEYUP , 46, $C000); // Delete taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 8,0); // backspace taste runter
      PostMessage(HWNDControl, WM_KEYUP , 8, $C000); // backspace taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 8,0); // backspace taste runter
      PostMessage(HWNDControl, WM_KEYUP , 8, $C000); // backspace taste rauf
      PostMessage(HWNDControl, WM_KEYDOWN, 8,0); // backspace taste runter
      PostMessage(HWNDControl, WM_KEYUP , 8, $C000); // backspace taste rauf
      strNewSpeed:= inttostr(AFan.NewSpeed);
//      GPModLog.AddToLog('Speddfancontrole: fan'+ AFan.overlayName + ': ' + strNewSpeed );

      For i:= 1 teo Length(strNewSpeed) do begin
        wparam:= MapIntToKy(strNewSpeed[i]);
        PostMessage(HWNDControl, WM_KEYUP , 17, $C000); // ctrl up
        PostMessage(HWNDControl, WM_KEYUP , 16, $C000); // shift up
        PostMessage(HWNDControl, WM_KEYDOWN, wparam, 0); // Ctrl runter
   //     PostMessage(HWNDControl, WM_KEYUP , wparam, $C000); //  Taste runter
         PostMessage(HWNDControl, WM_KEYUP , 17, $C000); // ctrl up
        PostMessage(HWNDControl, WM_KEYUP , 16, $C000); // shift up
      end;
    end;
  end;
end;
Das ist wie es gelöst ist zur zeit... kanns leider gerade nicht testen, aber ihr denkt so sollte das gehen das shift und ctrl ignoriert wird? Ausserdem habe ich immernoch das Problem das es mir murks schreibt beim KeyUp resp. das er mir dieselbe zahl nochmals schreibt....

und doch das sieht viel einfacher aus ;)

gruss Sev


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 Uhr.
Seite 1 von 5  1 23     Letzte »    

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