Bildschirmtastatur

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Bildschirmtastatur

Beitrag von unix »

Guten Tach erst mal!!


Ich wollte Fragen ob es möglich ist ein event an die Key-memmory zu senden, oder einfach ausgedrückt:

Ich hab ein Programm mit buttons wo "1", "2", "3", ... drauf steht
und ich will wenn man dort drauf klickt das das ans System geschickt wird als Keyevent sodass man es in jedem Programm verwenden kann.

Also ne BildschirmTastatur.

Und ja ich weiß das Windows so etwas schon hat ich will es aber Trotzdem selber weil ich ein etwas anderen Style benötige.

http://www.automation.siemens.com/hmi/g ... 270_10.jpg

Meine ist kaputt und ich hab kein Geld mehr. :lol: Scherz

Bin für jede Hilfe Dankbar!!
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
mike41
Beiträge: 13
Registriert: 20.06.2006 09:00
Wohnort: Wassenberg
Kontaktdaten:

KeyEevent

Beitrag von mike41 »

Hi Unix!

Mit dem Api-Befehl keybd_event kannst du Tastaturbefehle an
das jeweilige fokussierte Fenster schicken.

z.B

Code: Alles auswählen

keybd_event_(#VK_TAB,0,0,0)
#VK_TAB steht z.B für TAB

MfG Mike
PB 4.0
Wer programmiert greift ins volle Leben!
Herzrasen,Haareraufen aber auch jubeln und jauchzen ;-)
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: KeyEevent

Beitrag von Kiffi »

mike41 hat geschrieben:Mit dem Api-Befehl keybd_event kannst du Tastaturbefehle an
das jeweilige fokussierte Fenster schicken.
das Hauptproblem, dass sich mir stellen würde ist, dass zum Zeitpunkt, wo
ich auf der Bildschirmtastatur einen Button drücke, mein Fenster den Focus
hat. Wohin sollen dann also die Tastaturbefehle gesendet werden?

Ich habe mal ein ähnliches Projekt gehabt, in dem ich diese Problematik
dadurch gelöst habe, dass ich im Hintergrund via Hook die zuletzt aktiven
Fenster ermittelt habe. Das Projekt hat nicht wirklich Spaß gemacht...

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag von PBZecke »

Bei WM_SETFOCUS ist glaube ich im wParam das Handle des Fensters das
den Focus verloren hat. Nach dem Drücken des Buttons kann man ja den
Focus vor keybd_event dorthin zurück verfrachten.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

und wenn mans andersherum löst?

dass das keyboard-fenster den focus gar nicht annimmt?
oder das screen-keyboard nurn bild ist, kein fenster, und die tasten per koordinaten ausgelesen werden?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag von unix »

Da sich die Tastatur im selben fenster bzw. Screen befindet ist das kein Problem ich muss es nur mit ExamineKeyboard() abrufen können

aber so wie das gelesen habe gilt der befehl nur für fenster richtig??
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nein, genau umgekehrt.

die Keyboard-Lib, die ExamineKeyboard() enthält, ist für den Screen-Mode.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Siemens liefert bei Protool oder WinCC Flexible für Windows oder Windows CE eine eigende Bildschirmtastertur mit die in den Projekt nur aktiviert werden muss. Das Programm dazu liegt in der regel im Ordner "gemeinsame dokuemte\siemens\common" oder so ähnlich

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ABER:

wenn du eh mit ExamineKeyboard() arbeiten willst...

wie willst du denn dan weiter verfahren?

weil theoretisch müsstest du sowieso die tastatureingabe dann programmseitig interpretieren,
ein screen enthält keine elemente, die direkt tastatureingaben aufnehmen können (wie ein InputGadget)

also ist es doch egal, ob du deine interpretationsroutine so anpasst,
dass sie zusätzlich zu ExamineKeyboard() noch die klicks auf die
Koordinaten der Bildschirmtastatur verarbeitet.

das wäre wesentlich einfacher und performanter,
als erst die klickverarbeitung zu tasten zu machen und ans system zu schicken,
um sie dann per ExamineKeyboard() wieder zurückzuholen...

hoast mi?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich konnte es nicht lassen....

is bestimmt nicht die eleganteste lösung, und überarbeitenswert...

außerdem sinds längst nicht alle tasten, grad mit den sonderzeichen oder SHIFT muss man halt mal sehen wie man das dann löst...

mir war halt danach, das mal auszutesten.

ScreenKeyboard und echte Tastatur parallel.
"R" wird auch als RETURN angenommen, aber der RETURN-Key funzt.
witziger Weise wird der ENTER-Key (NumPad) als "-" registriert... k.a. wieso...

das kleine ScreenKeyboard:

Code: Alles auswählen

Dim KeyB.f(9,3)

Restore KeyCodes
For t=0 To 3
  For n=0 To 9
    Read a$
    KeyB(n,t) = Asc(a$)
  Next
Next

InitKeyboard()
InitSprite()
InitMouse()
OpenScreen(800,600,32,"keytest")


Repeat

  ExamineKeyboard()
  ExamineMouse()
  ClearScreen($100408)

  MX = MouseX() : MY = MouseY()

  I$="":IN$=""
    
  If KeyPres
    KeyPres -1
  Else
    I$ = KeyboardInkey()
  EndIf

  If KeyboardReleased(#PB_Key_Return)
      KeyPres = 5
      IN$ = "R"
      KX = 9
      KY = 2
  EndIf

  If I$
    KeyRow = 0
    KeyLine = 0
    Repeat
      If Asc(I$) = KeyB(KeyRow,KeyLine)
        KeyPres = 5
        IN$ = I$
        KX = KeyRow
        KY = KeyLine
      Else
        KeyRow +1
        If KeyRow = 10
          KeyRow = 0
          KeyLine +1
        EndIf
      EndIf
    Until KeyPres > 0 Or KeyLine = 4
  EndIf

If MouseButton(1)
  ButPres = 1
ElseIf ButPres = 1
  ButPres = 0
  If MX < 200 And XY < 80
    KeyPres = 5
    KX = MX/20 : KY = MY/20
    IN$ = Chr(KeyB(KX,KY))
  EndIf
EndIf

If KeyPres = 5
  If IN$ ="R"
    Show$=""
  Else
    Show$ + IN$
    If Len(Show$) > 40
      Show$ = Right(Show$,40)
    EndIf
  EndIf
EndIf

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor($FF8000)
    Box(0,0,200,80,$804000)
    If KeyPres
      Box(20*KX,20*KY,20,20,$A05000)
    EndIf
    For n=0 To 9
      Line(n*20+1,0,0,80,$402000)
    Next
    For n=0 To 3
      Line(0,n*20+1,200,0,$402000)
    Next
    For n=0 To 10
      Line(n*20,0,0,80,$C06000)
    Next
    For n=0 To 4
      Line(0,n*20,200,0,$C06000)
    Next
    For t=0 To 3
      For n=0 To 9
      DrawText(5+20*n,3+20*t,Chr(KeyB(n,t)))
      Next
    Next

    Line(20,300,400,0,$0040FF)
    Line(20,320,400,0,$0040FF)
    DrawText(20,303,Show$)

    Line(MX,MY, 8,16,$0080C0)
    Line(MX,MY,16, 8,$0080C0)
    Line(MX,MY,24,24,$0080C0)
  StopDrawing()

  If KeyboardPushed(#PB_Key_Escape) : EXIT = 1 : EndIf

  FlipBuffers()

Until EXIT = 1

End

DataSection

KeyCodes:

Data.s "1","2","3","4","5","6","7","8","9","0"
Data.s "q","w","e","r","t","z","u","i","o","p"
Data.s "a","s","d","f","g","h","j","k","l","R"
Data.s "y","x","c","v","b","n","m",",",".","-"
have fun.

PS
ein paar erklärungen...

ButPres fungiert als Flag für den MouseButton, damit der beim Release registriert wird, das verhintert mehrfachzeichen.

KeyPres wird auf 5 gesetzt, nur bei 5 wird die Taste registriert,
aber KeyPres fungiert gleichzeitig als Counter, damit die Taste 5 Frames lang Highlighted wird.

der RETURN-Key wird extra interpretiert, weil anscheinend Sonderzeichen nicht (alle) von KeyboardInkey() angenommen werden.

Die Schleife Repeat/Until KeyPres > 0 Or KeyLine = 4 erschien mir eleganter, als BREAK in geschachtelten For/Next


@unix
ja, das ist eine screen-, keine window-lösung.
wenn du ne WIN-lösung suchst, bist du mit ExamineKeyboard() aufm falschen Dampfer... ;)


PPS:
kleine korrektur: rücksetzung der Row/Line-Variablen ergänzt und vorangestellt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten