Tastendruck im Stringgadget?
Tastendruck im Stringgadget?
Hallo,
Ich setze einen Text mit SetGadgetText() in ein Stringgadget. Dabei wird auch der Event #PB_EventType_Change ausgelöst.
Ich möchte nun aber wissen, ob der User in diesem Textfeld einen Buchstaben eingegeben oder gelöscht/geändert hat. Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat. Unter VB gibt es dafür den Event KeyPress(). Ich finde so etwas in PB nicht. Wie kann ich das erreichen?
Grüsse,
Volker
Ich setze einen Text mit SetGadgetText() in ein Stringgadget. Dabei wird auch der Event #PB_EventType_Change ausgelöst.
Ich möchte nun aber wissen, ob der User in diesem Textfeld einen Buchstaben eingegeben oder gelöscht/geändert hat. Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat. Unter VB gibt es dafür den Event KeyPress(). Ich finde so etwas in PB nicht. Wie kann ich das erreichen?
Grüsse,
Volker
Frag einfach die EventGadgetID() ab, bei jeder Eingabe in dein Textfeld wird die GadgetID deines Textfeldes angegeben.
Code: Alles auswählen
; Fenster usw
#wg=11
StringGadget(#wg,10,10,300,20,"Hallo")
Repeat
Event=WaitWindowEvent()
If Event=#PB_EventGadget
Debug EventGadgetID(); Hier auswerten wenn die ID Deines Textfeldes (im Beispiel 11) kommt
EndIf
Until Event=#PB_Event_CloseWindow
Hallo Hannibal,
Danke. Das gibt aber auch Events beim anklicken und wenn das Programm mit SetGadgetText() den Inhalt ändert. Ich will aber wissen ob der USER etwas getippt hat. So erhalte ich Events die ich nicht unterscheiden kann (geklickt, getippt oder SetGadgetText()).
So Einfach ist es dann doch nicht (sonst hätte ich sicher nicht das Forum bemüht).
Grüsse,
Volker
Danke. Das gibt aber auch Events beim anklicken und wenn das Programm mit SetGadgetText() den Inhalt ändert. Ich will aber wissen ob der USER etwas getippt hat. So erhalte ich Events die ich nicht unterscheiden kann (geklickt, getippt oder SetGadgetText()).
So Einfach ist es dann doch nicht (sonst hätte ich sicher nicht das Forum bemüht).

Grüsse,
Volker
Hi,
also wenn das Programm den Inhalt ändert, musst Du das halt durch Deine Programmstruktur abfangen.
Wenn es Dir um das Ausschließen des Mausklicks geht, dann vergleich doch den Text - siehe unten oder beschreib Dein Problem noch mal genauer. Viele Grüße Hanniball
also wenn das Programm den Inhalt ändert, musst Du das halt durch Deine Programmstruktur abfangen.
Wenn es Dir um das Ausschließen des Mausklicks geht, dann vergleich doch den Text - siehe unten oder beschreib Dein Problem noch mal genauer. Viele Grüße Hanniball
Code: Alles auswählen
#win=0:#sg=1
Global textalt$
OpenWindow(#win,0, 0, 800, 500, #PB_Window_SystemMenu, "ROMAHN - VERLAG")
CreateGadgetList(WindowID(#win))
StringGadget(#sg,10,10,300,20,"Hallo")
textalt$=GetGadgetText(#sg)
Repeat
Event=WaitWindowEvent()
If EventGadgetID()=#sg
textneu$=GetGadgetText(#sg)
If textneu$<>textalt$
Debug "getippt"
textalt$=textneu$
EndIf
EndIf
Until Event=#PB_Event_CloseWindow
@Hannibal:
Danke. Aber wie im ersten Post schon geschrieben:
@Jear:
Danke, das liegt nahe, nicht wahr
. Aber EventTyp() hat keine Unterscheidung für Tastendrücke. Guckst Du in Hilfe:
Und irgendwie bekomme ich das Gefühl, dass hier keiner meine Frage im ersten Post richtig gelesen hat...
Alle bis jetzt vorgeschlagenen Tipps habe ich in meinem ersten Posting bereits ausgeschlossen. So weit war ich bei Fragestellung auch.
Volker
Danke. Aber wie im ersten Post schon geschrieben:
Die Idee hatte ich auch schon, aber ich finde es höchst seltsam, wenn ich in verschiedenen Prozeduren den Text wechsle und dann mit einer globalen Variablen für jedes Feld prüfen muss ob sich was geändert hat.Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat.
@Jear:
Danke, das liegt nahe, nicht wahr

Und wie im ersten Post schon geschrieben, liefert ein SetGadgetText() ebenfalls ein #PB_EventType_Change. Ich kann einen Tastendruck nicht vom Klick oder SetGadgetText() unterscheiden. Gibt es denn keinen Event für einen Tastendruck in einem Gadget?#PB_EventType_LeftClick : Klick mit der linken Maustaste
#PB_EventType_RightClick : Klick mit der rechten Maustaste
#PB_EventType_LeftDoubleClick : Doppelklick mit der linken Maustaste
#PB_EventType_RightDoubleClick : Doppelklick mit der rechten Maustaste
#PB_EventType_Focus : Fokus erhalten
#PB_EventType_LostFocus : Fokus verloren
#PB_EventType_Change : Inhalt hat sich geändert.
Und irgendwie bekomme ich das Gefühl, dass hier keiner meine Frage im ersten Post richtig gelesen hat...


Volker
@alle:
Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...
Volker
Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...
Volker
Schau doch mal in den Bereich 'Allgemein' diesen Beitrag an:Volker Schmid hat geschrieben:@alle:
Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...
http://forums.purebasic.com/german/viewtopic.php?t=2518
Da wurde erst gestern etwas gezeigt was Dir dabei helfen könnte.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Hallo,
Ich habe mir nun ein paar Hook-Routinen gebastelt und kann die ja hier reinstellen. So klappt es bei mir Wunderbar!
Anlegen kann man dann einzelne Hooks einfach so:
Beenden eines Hooks dann so:
Beenden aller Hooks geht dann so:
Vielleicht kann es ja mal jemand brauchen!
Grüsse,
Volker
Ich habe mir nun ein paar Hook-Routinen gebastelt und kann die ja hier reinstellen. So klappt es bei mir Wunderbar!
Code: Alles auswählen
Structure Hook
hWnd.l
OriginalAdress.l
EndStructure
; Liste für die gesetzten Hooks anlegen
NewList Hooks.Hook()
; ####### HookProzedur #######
Procedure KeyHookProc(hWnd, Msg, wParam, lParam)
; Beispiel für das auffangen eines Tastedrucks
If Msg = #WM_KEYDOWN
; Tasten wurden gedrückt!
Debug "Tastendruck!"
EndIf
; Mit Original-Prozedur weitermachen...
ForEach Hooks()
If Hooks()\hWnd = hWnd
; Original-Einsprungpunkt übergeben
Weiter.l = CallWindowProc_(Hooks()\OriginalAdress, hWnd, Msg, wParam, lParam)
Break
EndIf
Next
ProcedureReturn Weiter.l
EndProcedure
; ####### Start eines Hooks auf ein Gadget #######
Procedure.l StartHookOnGadget(hWnd, ProcAdress.l)
; ProcAdress erhält man mit @SubRoutineName()
AddElement(Hooks())
Hooks()\hWnd = hWnd
Hooks()\OriginalAdress = SetWindowLong_(hWnd, #GWL_WNDPROC, ProcAdress.l)
ProcedureReturn Hooks()\OriginalAdress
EndProcedure
; ####### Stoppen eines Hooks auf ein Gadget #######
Procedure StopHookOnGadget(hWnd)
; Benötigt den Handle des gehookten Gadgets (zB mit GadgetID())
ForEach Hooks()
If Hooks()\hWnd = hWnd
SetWindowLong_(hWnd, #GWL_WNDPROC, Hooks()\OriginalAdress)
DeleteElement(Hooks())
Break
EndIf
Next
EndProcedure
; ####### Alle Hooks entfernen #######
Procedure StopHookOnAllGadgets()
ForEach Hooks()
SetWindowLong_(Hooks()\hWnd, #GWL_WNDPROC, Hooks()\OriginalAdress)
Next
ClearList(Hooks())
EndProcedure
Code: Alles auswählen
StartHookOnGadget(GadgetID(#txtRuleNameProc), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtRuleNameWin), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtWindowTitle), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtProcessName), @KeyHookProc())
Code: Alles auswählen
StopHookOnGadget(GadgetID(#txtRuleNameProc))
Code: Alles auswählen
StopHookOnAllGadgets()

Grüsse,
Volker