Delphi-PRAXiS
Seite 2 von 5     12 34     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)

himitsu 4. Mai 2010 12:26

Re: Explizites tasten event auslösen
 
Zitat:

Zitat von idefix2
Nebenbei: Wäre statt ... nicht einfacher ...

da
Zitat:

Code:
wparam := MapIntToKey(strNewSpeed[color=#ff0000][b][i][/b][/color]);

Delphi-Quellcode:
wparam := Ord(strNewSpeed[i]) + Ord('0');
oder gleich
Delphi-Quellcode:
PostMessage(HWNDControl, WM_KEYDOWN, Ord(strNewSpeed[i]) + Ord('0'), 0);

idefix2 4. Mai 2010 12:57

Re: Explizites tasten event auslösen
 
Wozu soll das nochmalige ctrl-op und shft-up nach dem Tastendruck dienen?

gibb 4. Mai 2010 13:04

Re: Explizites tasten event auslösen
 
das hab ich mich auch gefragt ;) aber ist von dir:
"shift loslassen", "Taste drücken", "Taste loslassen", "shift loslassen"

idefix2 4. Mai 2010 13:12

Re: Explizites tasten event auslösen
 
Eben fällt mir ein - Wenn ich die Messages verfolge, die ein echter Tastendruck produziert, dann wird beim Keyup meistens $8000 und nicht $C000 als LPARAM erzeugt und an meine Hook-Routine übergeben. Das Bit 30 bezieht sich auf den vorherigen Zusatnd der Taste, ich weiss aber nicht sicher, wie der Wert wirklich genau sein muss.

Ich habe jetzt nicht nachgelesen und es nicht probiert, aber versuche doch einmal, das Keyup statt mit LPARAM=$C000 mit LPARAM=$8000 zu erzeugen, möglicherweise kommt dann keine zweite Ziffer nach.

-----

Ich habe gemeint danach nicht keyup, sondern keydown, damit der gleiche Status wie vor Deinen künstlichen Tastaturerignissen herrscht. Entschuldige, hab mich verschrieben.
Das ganze natürlich nur, wenn die Shift Taste tatsächlich gedrückt war, den Status liefert Dir vorher

ShftIsPressed := GetKeyState(VK_SHIFT) and $80 = 0;

Für ctrl analog


Nachdem die Messages nur an Dein eigenes Fenster gehen, ist das keydown danach wahrscheinlich ohnehin überflüssig, aber ganz sicher bin nicht.

gibb 6. Mai 2010 11:16

Re: Explizites tasten event auslösen
 
Hi

Also hab das getestet.

1. das Piepsen kommt immer noch wenn ich ctrl oder shift drücke, das keyup ctrl hat also keinen einfluss!
2. Das Keyup event produziert auch mit $8000 als lparam weiterhin einen 2 ten tastendruck!

mhmm, was kann ich sonst noch machen?

gruss gibb

gibb 6. Mai 2010 13:08

Re: Explizites tasten event auslösen
 
hi,

Ich hab folgendes gefunden:
http://www.delphitricks.com/source-c...oard_keys.html

was will er mir damit erklären=?
* NOTE:
* Setting the keyboard state will not work across applications
* running in different memory spaces on Win32 unless AttachThreadInput
* is used to connect to the target thread first.
*Created: 02/21/96 16:39:00 by P. Below

weil das hier klingt doch gut:
* Description:
* Uses keybd_event to manufacture a series of key events matching
* the passed parameters. The events go to the control with focus. <- scheisse aber kann man ja anpassen
* Note that for characters key is always the upper-case version of <- gut aber versteh leider nicht wie er das genau macht.
* the character. Sending without any modifier keys will result in
* a lower-case character, sending it with [ssShift] will result
* in an upper-case character!
*****************************

habs, wmkeyup muss als lparam $C0000000 mitgegeben werden damits funzt. Also das nur noch 1 Zahl entsteht =D

jetzt habe ich aber immer noch das Problem mit ctrl, shift und neu auch gefunden '^'

Sieht jemand wie er das umgeht?

Gruss gibb

idefix2 6. Mai 2010 20:17

Re: Explizites tasten event auslösen
 
Delphi-Quellcode:
ShftGedrueckt := GetKeyState(VK_SHIFT) and 128 = 0; // Shift Status abfragen
CtrlGedrueckt := GetKeyState(VK_CTRL) and 128 = 0; // Ich glaub die Taste heisst VK_CTRL

if ShftGedrueckt then keybd_event (VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
if CtrlGedrueckt then keybd_event (VK_CTRL, 0, KEYEVENTF_KEYUP, 0);
keybd_event (Taste,0,0,0)
keybd_event (Taste,0,KEYEVENTF_KEYUP,0)
if ShftGedrueckt then keybd_event (VK_SHIFT, 0, 0, 0);
if CtrlGedrueckt then keybd_event (VK_CTRL, 0, 0, 0);

gibb 7. Mai 2010 10:09

Re: Explizites tasten event auslösen
 
GetKeyState(VK_SHIFT) and 128 = 0;
Das ergibt true auch wenn keine shift taste gedrückt ist ^^'

aber wofür ist das and 128=0 gut? diese bedingung ist ja immer False.... wie kann dann das result true sein?

gruss Sgibb

idefix2 7. Mai 2010 11:40

Re: Explizites tasten event auslösen
 
GetKeyState(VK_SHIFT) liefert ein byte, in Bit 8 des Bytes ist der gedrückt-Status der Taste
mit "and 128" wird dieses Bit maskiert, Du kannst auch "and $80" schreiben, dann ist vielleicht noch klarer, was gemeint ist
wenn da null herauskommt war die Taste gedrückt,
wenn die Taste oben war, kommt 128 heraus, das ist <>0.

Schau Dir die Delphi-hilfe zu GetKeyState an

Du kannst auch Klammern setzen, wenn Dir die Operatorpriorität nicht unmittelbar klar ist. Der Ausdruck bedeutet

(GetKeyState(VK_SHIFT) and 128) = 0

und nicht

GetKeyState(VK_SHIFT) and (128 = 0)


Die Vergleichsoperatoren haben die niedrigste Priorität von allen Operatoren.

gibb 7. Mai 2010 11:56

Re: Explizites tasten event auslösen
 
mhmm, das ganze gibt trozdem true zurück wenn shift nicht gedrückt ist.

Aber danke für die erklärung mit den klammern.

wie das mit dem Maskieren funktioniert habe ich nicht verstanden, kannst du mir hierzu das ganze einweig veranschaulichen?

ist das wie bei den Subnetzen wo mit der and operation das binäre verglichen resp. umgeschrieben wird?

einfach auf 128 abfragen dann stimmts, nur kommt der leider nie mehr raus aus dem shift/CTRL wenn der mal von meiner app gesetzt wurde...

Das einzige was hilft, die app manuell mit der maus beenden und ctrl, shift tasten links und rechts auf der tastatur zu drücken, sonst erholt der sich nimmer XD


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.
Seite 2 von 5     12 34     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