Explizites tasten event auslösen
Hallo zusammen,
Ich mache folgendes:
Delphi-Quellcode:
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...
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; 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 |
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 |
Re: Explizites tasten event auslösen
Versuchs doch mal mit der Unit SndKeys32: http://www.delphi3000.com/articles/article_1617.asp
|
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 |
Re: Explizites tasten event auslösen
Also die Taste Control-S müsste doch so aussehen:
Delphi-Quellcode:
Bringt dich das vielleicht weiter?
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); |
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 |
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 |
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 |
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:
nicht einfacher
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;
Delphi-Quellcode:
Result := StrToInt (akey) + 48;
|
Re: Explizites tasten event auslösen
hi, hab das jetzt folgendermassen gelöst:
Delphi-Quellcode:
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....
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; und doch das sieht viel einfacher aus ;) gruss Sev |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr. |
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