Seite 1 von 2

Wie einen Buttonklick simulieren?

Verfasst: 23.09.2009 23:01
von Kurzer
Sorry, aber offensichtlich bin ich zu blöd zum suchen. :freak:
Wie hat ein SendMessage_() auszusehen, wenn ich damit einem ButtonImgageGadget einen Klick unterjubeln möchte?

Es geht darum, daß ich die Funktion, die hinter diesem Button liegt, auch mittels Shortcut "STRG-Return" innerhalb des Fensters auslösen möchte.
Dazu habe ich mittels...

Code: Alles auswählen

AddKeyboardShortcut(iWindowNr, #PB_Shortcut_Return|#PB_Shortcut_Control, #DCC_Menu_Send)
einen entsprechenden ShortCut angelegt, der mir ein MenuEvent namens #DCC_Menu_Send erzeugt. Bei der Auswertung dieses MenuEvents möchte ich dann den eigentlichen Button antriggern.

Beispiele, die ich gefunden habe, senden einen Mausklick mitsamt den Koordinaten an den Button. Abgesehen, daß ich's nicht zum laufen gebracht habe, kommt mir das ziemlich "von hinten durch die Brust ins Auge" vor.

Gibt es für diesen Zweck nicht eine einfache #STELLDIRVORDUBISTGEKLICKTWORDEN-Message oder eine andere Alternative?

Edit: Tippfehler im Betreff korrigiert zwecks besser Findbarkeit per Suche (dank an Vera)

Re: Wie einen Buttenklick simulieren?

Verfasst: 23.09.2009 23:16
von Kiffi
ähm, wieso rufst Du nicht direkt den Code auf, den das ButtonImgageGadget() ausführt?

Grüße ... Kiffi

Re: Wie einen Buttenklick simulieren?

Verfasst: 23.09.2009 23:20
von ts-soft

Code: Alles auswählen

Import ""
  PB_Gadget_SendGadgetCommand(hWnd, EventType)
EndImport 
Gruß

Thomas

Re: Wie einen Buttenklick simulieren?

Verfasst: 23.09.2009 23:24
von AND51
Kurzer hat geschrieben:Gibt es für diesen Zweck nicht eine einfache #STELLDIRVORDUBISTGEKLICKTWORDEN-Message oder eine andere Alternative?
Die korrekte Syntax lautet

Code: Alles auswählen

PostMessage_(WindowID(#Fenster), #STELLDIRVORDUBISTGEKLICKTWORDEN, #GadgetID, 0)
was in PB-Syntax wie folgt lauten dürfte

Code: Alles auswählen

PostMessage_(WindowID(#Fenster), #PB_Event_Gadget, #GadgetID, 0)
Die Idee: Du brauchst deiner eigenen Eventschleife keine Events a là StellDirVorDuBistGeklicktWorden unterjubeln, du kannst auch einfach die PureBasic-Event-Konstanten benutzen. Hab ich auch schon mal so gemacht. Ist aber ewig lange her und das hier habe ich grob so aus dem Kopf geschrieben. Weiß auch nicht, welcher Parameter an welche Stelle muss, oder ob man besser noch ein #PB_EventType_LeftClick an die 4. Stelle setzen sollte.

Re: Wie einen Buttenklick simulieren?

Verfasst: 23.09.2009 23:48
von Kurzer
@ts-soft & AND51: Klappt leider beides nicht. Heute ist es mir schon zu spät, werde morgen mal ne Mini-App bauen, um das weiter zu testen. Ist jetzt blöd zu machen, wenn da der ganze restliche Code mit Thread usw... noch dranhängt.

@Kiffi: Ich möchte dadurch erreichen, daß sich die Funktionalität nur an einer Stelle befindet.
Es handelt sich momentan zwar nur um einen Prozeduraufruf, aber das kann sich ja noch ändern - und dann hätte ich zwei Baustellen mit gleichem Inhalt.

Re: Wie einen Buttenklick simulieren?

Verfasst: 23.09.2009 23:54
von Kiffi
Kurzer hat geschrieben:@Kiffi: Ich möchte dadurch erreichen, daß sich die Funktionalität nur an einer Stelle befindet.
OK, ich verbuche das bei mir mal unter 'schräge Programmierung'. ;-)

Grüße ... Kiffi

Re: Wie einen Buttenklick simulieren?

Verfasst: 24.09.2009 00:00
von AND51
Kiffi hat geschrieben:
Kurzer hat geschrieben:@Kiffi: Ich möchte dadurch erreichen, daß sich die Funktionalität nur an einer Stelle befindet.
OK, ich verbuche das bei mir mal unter 'schräge Programmierung'.
Und ich vermute einfach mal, du könntest die Funktionalität einfach in eine Prozedur packen die du von 2 Stellen aus aufrufst: Einmal, wenn das Gadget geklickt wird und einmal, wenn der Shortcut gedrückt wird.

Re: Wie einen Buttenklick simulieren?

Verfasst: 24.09.2009 00:01
von ts-soft
Kurzer hat geschrieben:@ts-soft & AND51: Klappt leider beides nich

Code: Alles auswählen

Import ""
  PB_Gadget_SendGadgetCommand(hWnd, EventType)
EndImport

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
AddKeyboardShortcut(0,  #PB_Shortcut_Return | #PB_Shortcut_Control, 0)
ButtonImageGadget(0, 10, 10, 80, 80, 0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Menu
      Select EventMenu()
        Case 0
          PB_Gadget_SendGadgetCommand(GadgetID(0), #PB_EventType_LeftClick)
      EndSelect
     Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Debug "Pressed"
      EndSelect
      
  EndSelect
ForEver
Was klappt hier nicht? Oder was habe ich mißverstanden?

Gruß
Thomas

Re: Wie einen Buttenklick simulieren?

Verfasst: 24.09.2009 00:14
von Kurzer
ts-soft: Ja, Dein Beispiel läuft wunderbar, vielen Dank für die Mühe.
Ich habe mich von dem "EventType" irritiren lassen und Deinen Einzeiler falsch angewendet.
EventType werte ich gar nicht aus im Messageloop... aber das hat damit ja offensichtlich nichts zu tun.

Von wo ist diese Funktion importiert? Du hast keinen Dateinamen angegeben.

Re: Wie einen Buttenklick simulieren?

Verfasst: 24.09.2009 01:11
von Kaeru Gaman
AND51 hat geschrieben:
Kiffi hat geschrieben:
Kurzer hat geschrieben:@Kiffi: Ich möchte dadurch erreichen, daß sich die Funktionalität nur an einer Stelle befindet.
OK, ich verbuche das bei mir mal unter 'schräge Programmierung'.
Und ich vermute einfach mal, du könntest die Funktionalität einfach in eine Prozedur packen die du von 2 Stellen aus aufrufst: Einmal, wenn das Gadget geklickt wird und einmal, wenn der Shortcut gedrückt wird.
und wenn du wegen der Kapselung keine Proc verwenden willst...
du kannst bei jeder Abfrage, die die Funktion auslösen soll, ein Flag setzen, und am ende der Schleife fragst du das Flag ab und hast nur dort deinen Ausführungscode.

Code: Alles auswählen

EnableExplicit
OpenWindow( 0, #PB_Ignore,#PB_Ignore, 400, 300, "Demo" )
  ButtonGadget( 0, 16, 16, 120, 32, "click 1" )
  ButtonGadget( 1, 16, 64, 120, 32, "click 2" )
  AddKeyboardShortcut( 0, #PB_Shortcut_A, 1 )
  AddKeyboardShortcut( 0, #PB_Shortcut_B, 2 )
Define ACTION = 0
Define EXIT = 0
Define Event, EvGad, EvMen 
Repeat
  Event = WaitWindowEvent()
  EvGad = EventGadget()
  EvMen = EventMenu()
  Select Event
    Case #PB_Event_Gadget
      Select EvGad
        Case 0
          ACTION = 1
        Case 1
          ACTION = 1
      EndSelect
    Case #PB_Event_Menu
      Select EvMen
        Case 1
          ACTION = 1
        Case 2
          ACTION = 1
      EndSelect
    Case #PB_Event_CloseWindow
      EXIT = 1
  EndSelect
  If ACTION
    ACTION = 0
    Debug "yo action"
    MessageBeep_(#MB_ICONEXCLAMATION)
  EndIf
Until EXIT = 1
das ist auf jeden mal tausend meilen straighter programmiert als so'n schwules event senden...