Wie einen Buttonklick simulieren?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Wie einen Buttonklick simulieren?

Beitrag 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)
Zuletzt geändert von Kurzer am 24.09.2009 20:38, insgesamt 2-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie einen Buttenklick simulieren?

Beitrag von Kiffi »

ähm, wieso rufst Du nicht direkt den Code auf, den das ButtonImgageGadget() ausführt?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie einen Buttenklick simulieren?

Beitrag von ts-soft »

Code: Alles auswählen

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

Thomas
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Wie einen Buttenklick simulieren?

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Wie einen Buttenklick simulieren?

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie einen Buttenklick simulieren?

Beitrag 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
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Wie einen Buttenklick simulieren?

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie einen Buttenklick simulieren?

Beitrag 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
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Wie einen Buttenklick simulieren?

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Wie einen Buttenklick simulieren?

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten