Delphi-PRAXiS
Seite 3 von 5     123 45      

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)

idefix2 7. Mai 2010 12:36

Re: Explizites tasten event auslösen
 
AND auf Bytes angewendet ist eine bitweise Operation:

Beispiel
Wenn in Variable a binär 11001100 (= 208)
und in Variable b binär 10101010 (= 170)
steht, ist a and b binär 10001000 (= 136)

Wenn Du a als Variable und b als Maske bezeichnet, dann liefert a and b als Ergebnis nur die gesetzten Bits der Variable a, die auch in der Maske b gesetzt sind. Dort, wo die Maske b 0-Bits hat, werden durch die AND Operation die entsprechenden Bits der Variablen "maskiert", also gelöscht. Kurz gesagt, in der maske sind die Bits gesetzt, die mich interessieren, durch die Maskierung werden die anderen Bits der Variablen, die mich nicht interessieren, null gesetzt.
x and 128 (binär 10000000, hex 80) maskiert mit Ausnahme des höchstwertige Bits alle Bits der Variablen, d.h. im Ergebnis ist nur dieses Bit gesetzt, wenn es in der Variablen gesetzt ist, und gelöscht, wenn es in der Variablen auch schon Null war, alle anderen Bits des Ergebnisses sind immer =0.

gibb 7. Mai 2010 12:59

Re: Explizites tasten event auslösen
 
ah oke, dann ist es das was ich aus dem subneting noch in errinerung hatte ;)

Wer hätte gedacht das das wirklich benutzt wird XD

EDIT: Mhmm, also es scheint einwenig zufall zu sein welche ctrl/shift daste gedrückt und gelöst wird ob jetzt die rechte gedrückt wird oder die linke usw. is mist das ganze XD

gibb 7. Mai 2010 15:56

Re: Explizites tasten event auslösen
 
jemand nen plan wieso das das so ist?

code sieht so aus:
Delphi-Quellcode:
        wparam:= MapIntToKey(strNewSpeed[i]);
     //   PostMessage(HWNDControl, WM_KEYUP , VK_CONTROL, $20000000); // ctrl up
     //   PostMessage(HWNDControl, WM_KEYUP , VK_SHIFT, $10000000); // shift up
        ShftGedrueckt := GetKeyState(VK_SHIFT) and 128 = 128; // Shift Status abfragen
        CtrlGedrueckt := GetKeyState(VK_CONTROL) and 128 = 128; // Ich glaub die Taste heisst VK_CTRL
        if ShftGedrueckt then
          keybd_event (VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
        if CtrlGedrueckt then
          keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
        PostMessage(HWNDControl, WM_KEYDOWN, wparam, 0); // Ctrl runter
        PostMessage(HWNDControl, WM_KEYUP , wparam, $C0000000); //  Taste runter
        if ShftGedrueckt then keybd_event (VK_CONTROL, 0, 0, 0);
        if CtrlGedrueckt then keybd_event (VK_CONTROL, 0, 0, 0);
und ist leicht zu testen, man braucht nur ne 2 te app macht und dort auf das formular ein edit postet findet diese funktion den handle des edits:
Delphi-Quellcode:
function TSFontroler.DebugHandle():hwnd;
var
  wndMain, wndChild: HWND;
begin
  wndMain := FindWindow('TForm1','Form1');
  if wndMain <> 0 then
  begin
    wndChild := FindWindowEx(wndMain, 0, 'TEdit', nil);
    if wndChild <> 0 then
    begin
      Result:= wndChild;
    end;
  end;
end;
wenn man zusätzlich das hier definiert:
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
oldKey, newKey :Char ;
begin
  if (key in [#48..#57, #8]) then    begin
   beep;
   FKeyList:= FKeyList + key;
  end else begin
    Key:= #0
  end;

end;
und bei postmessage eine zahl mitgibt. dann wird wenn man im else teil der funktion landet ctrl oder shift nicht ignoriert. weil dann aus der zahl einen nicht zahl charakter gemacht wird.

Mein Problem ist jetzt ja nicht mehr das ich im else teil lande sondern ctrl/Shift nicht mehr deaktiviert wird nach
Delphi-Quellcode:
        if ShftGedrueckt then keybd_event (VK_CONTROL, 0, 0, 0);
        if CtrlGedrueckt then keybd_event (VK_CONTROL, 0, 0, 0);
wenn ich anschliessend den ctrl/shift taste loslasse.

mfg Gibb

idefix2 7. Mai 2010 18:47

Re: Explizites tasten event auslösen
 
Leider bin ich bei Deinem letzten Posting völlig ausgestiegen. Ich verstehe nicht, was die diversen Codeschnippsel konkret bewirken sollen, und auch nicht, was jetzt Dein konkretes Problem ist.

Was mir auffällt: Du mischt Postmessage mit keybd_event, ich habe keine Ahnung, ob sich die zwei auf die Art vertragen. Vielleicht solltest Du die CTRL und die SHIFT Taste auch mittels PostMessage schicken statt mit keybd_event - obwohl ich eigentlich glaube, dass das schon auch gehen müsste, und dass das nicht für Dein Problem verantwortlich ist. Ist auf jeden Fall nicht sehr schön, einheitlich wär sicher besser.

gibb 10. Mai 2010 08:20

Re: Explizites tasten event auslösen
 
Also, der erste schnippsel ist dir ja bekannt, der kommt aus app1

der 2 te schnippsel ist um einen handle von einem edit auf einem Formular zu erhalten. Also nix weiteres machen als ne neue Delphi app erstellen und auf form1 ein edit posten ohne etwas anzupassen. (app2)


der 3 te schnippsel ist onkeypress vom edit auf dem Formular. ich prüffe ob das was ankommt ne Zahl ist und wenn nicht denn geht er in den Else teil. Er geht nur in den Else teil wenn ctrl gedrückt ist und du mit postmessage ne Zahl schickst.

jetzt mache ich nix anderes als von der app1 mit dem ersten schnippsel zahlen zu senden. wenn ctrl/Shift gedrückt wird lande ich bei app2 im breackpoint im else teil.

---------------------------------------

Problem ist nun folgendes, mache ich das so wie oben, verlässt er den ctrl/shift state nicht mehr wenn ich die ctrl/Shift taste danach wieder loslase(auf der tastatur) also es nur noch ein keyUp gibt.

Ich drücke auf der tastatur ctrl, app1 sendet ctrl up, app1 sendet zahl an app2, app1 macht ctrl down, ich lasse die ctrl taste los. Der Status von ctrl ist aber weiterhin gedrückt. bis ich auf der tastatur wieder ctrl down ctrl up mache und das auf der rechten seite des Keyboards links bringts nichts.

Ich hab dir die schnippel gemacht damit du das einmal testen kannst. ;)


---------------------------------------

"Was mir auffällt: Du mischt Postmessage mit keybd_event"

Ja dem ist so, da postmessage ctrl up keine auswirkung hat, zumindest so nicht wie ich es implementiert hatte.

und keybd_event nicht die zahl an einen Bestimmten handle senden kann. Daher der mix. Ist unschön, aber was will man machen wenns nur so "geht"

hoffe es hat sich geklärt.

gruss gibb

idefix2 10. Mai 2010 11:43

Re: Explizites tasten event auslösen
 
ja, jetzt verstehe ich. Ich vermute, Du raufst mit einem ähnlichen Problem, das auch mir zu schaffen gemacht hat, nämlich dass die echten Tastenereignisse, wenn Tasten schnell gedrückt und losgelassen werden, die künstlichen Tastenereignisse, die durch früher erfolgte echte Tastenereignisse ausgelöst worden sind, überholen können. Ich nehme an, das "echte" Keyup vom wirklichen Loslassen der Taste taucht vor den künstlichen Events auf, deshalb ist am Ende der Tastenstatus unten und nicht oben.

Zum Überprüfen dieser Annahme: Halte einmal die Umschalttaste länger gedrückt, also bis wirklich alles angekommen ist, was am Ziffern-Tastendruck hängt, und lass danach erst die Umschalttaste los. Dann sollte sich das Ding so benehmen, wie Du es erwartest.

Ich habe das in meinem Programm so gelöst: Ich merke mir alle Tastenereignisse, die ich künstlich ausgelöst habe, in einer Liste (bzw. verwende ich der Einfachheit Halber einen String) und lösche ein Ereignis erst aus der Liste, wenn es wirklich eintrifft. Wenn diese Liste nicht leer ist, werden "echte" Tastaturereignisse - solche mit Scancode<>0 - nicht mehr durchgelassen, sondern sie werden geblockt und dafür künstlich erzeugt (und natürlich auch an die Liste der künstlich erzeugten Ereignisse angehängt). Auf die Art werden sie sicher hinter die anderen Ereignisse gereiht, und können früher erzeugte künstliche Ereignisse nicht überholen.

gibb 10. Mai 2010 12:44

Re: Explizites tasten event auslösen
 
hi, ich merk gerade ich hatte gelogen was das funktionieren betrifft. es ist dennoch z.b. wenn ich 3 sende ein * wenn ich shift gedrückt halte :(((((

Und du hattest recht, der status stimmte nicht, also wenn ich wirklich das ganze nur 1 mal ausführe und warte mit dem keyup auf der tastatur bis das ganze 100% abgesetzt wurde bleibt auch ctrl/Shift nicht hängen.

Hilft jetzt aber dennoch nicht solange immernoch ein * ankommt :(

gruss Sev

idefix2 10. Mai 2010 19:13

Re: Explizites tasten event auslösen
 
hmm, leider bin ich da jetzt auch ratlos. Vielleicht ist das Mischen von keybd_event und un postmessage doch nicht möglich, und es kommt dabei auch die reihenfolge durcheinander.

Du könntest Dir eventuell folgendes versuchen:

die Handle des fensters holen, das den Focus hat, und es dir merken
dann den Focus auf deine Control legen
dann alle Daten mit keybd_event an dein control schicken
und zuletzt dem anderen Control wieder den Focus geben

Viel mehr fällt mir dazu leider auch nicht ein. Vor allem weiss ich nicht, ob nicht doch etwas ganz anderes daran schuld ist, dass es nicht so tut, wie du willst.

gibb 11. Mai 2010 11:29

Re: Explizites tasten event auslösen
 
hi,
der letzte vorschlag könnte zwar funktionieren aber da das programm im hintergrund läuft und alle sekunde schreibt währe das EXTREM mühsam wenn einem der fokus alle sekunde entzogen wird. Das ist definitiv keine Option.

Was ich mir aber gerade überlege, was macht ctrl genau? Wenn ctrl gedrückt ist wird da einfach aufadiert? also sowas du drückst die 3 das z.b. #50 entspricht jetzt ist controle noch gedrückt also entspricht das #50 + 24= #74 =* das sind alles fiktive werte!

Das frage ich weil man dann if shiftgedrückt then #50-#24 senden und ankommen tut dann #26+ #24 = #50= 3

machen könnte. und das OHNE ins ctrl/Shift focus reinzupfuschen.

gruss gibb

idefix2 11. Mai 2010 14:06

Re: Explizites tasten event auslösen
 
Das mit dem Focus geht also offenbar nicht, verstehe ich. Ausserdem kann glaub ich nur ein Control den Focus bekommen, das sichtbar ist, und es wird automatisch in den Vordergrund gestellt, das wäre wohl auch ein Hindernis.

Zu Deiner Frage: Nein, das ist leider nicht so, Control aktiviert einfach ein anderes Layout für die Tastatur, jede einzelne Taste wird anders umgesetzt als ohne die Umschaltung. Im Moment weiss ich für Dein Problem leider auch keine Lösung, wenn mir etwas einfällt, melde ich mich wieder.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr.
Seite 3 von 5     123 45      

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