AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Explizites tasten event auslösen
Thema durchsuchen
Ansicht
Themen-Optionen

Explizites tasten event auslösen

Ein Thema von gibb · begonnen am 29. Mär 2010 · letzter Beitrag vom 26. Mai 2010
Antwort Antwort
Seite 3 von 5     123 45      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#21

Re: Explizites tasten event auslösen

  Alt 7. Mai 2010, 13:36
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.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#22

Re: Explizites tasten event auslösen

  Alt 7. Mai 2010, 13:59
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
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#23

Re: Explizites tasten event auslösen

  Alt 7. Mai 2010, 16:56
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
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#24

Re: Explizites tasten event auslösen

  Alt 7. Mai 2010, 19:47
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.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#25

Re: Explizites tasten event auslösen

  Alt 10. Mai 2010, 09:20
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
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#26

Re: Explizites tasten event auslösen

  Alt 10. Mai 2010, 12:43
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.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#27

Re: Explizites tasten event auslösen

  Alt 10. Mai 2010, 13:44
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
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#28

Re: Explizites tasten event auslösen

  Alt 10. Mai 2010, 20:13
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.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#29

Re: Explizites tasten event auslösen

  Alt 11. Mai 2010, 12:29
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
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#30

Re: Explizites tasten event auslösen

  Alt 11. Mai 2010, 15:06
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 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