Seite 1 von 1

Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hide ?

Verfasst: 29.07.2012 20:14
von TheCube
Hallo, da bin ich mal wieder ... und wiedermal muss ich den DAU beschützen. :wink:
In einem benötigten Fremdprogramm gibt es eine Checkbox die nicht irrtümlich verstellt werden darf, der Haken ist per Default gesetzt und soll es auch bleiben. Leider liegt ein oft genutzter Button im selben Fenster (was die ganze Zeit auf dem Desktop liegt), und nach soundsovielen Arbeitswiederholungen wird da jemand danebengeklickt haben.
Wir fangen nicht bei Null an, ich hab da mal was vorbereitet:

Code: Alles auswählen

;Das hier ist nur ein Dummyprogramm zum "spielen", bitte .EXE draus machen und starten
OpenWindow(0, #PB_Ignore, #PB_Ignore, 270, 100, "Fremdprogramm-Checkbox", #PB_Window_SystemMenu)
CheckBoxGadget(0, 20, 20, 150, 20, "Option1")
CheckBoxGadget(1, 20, 40, 150, 20, "Option2")
TextGadget(2, 20,  70, 250, 20, "Die Checkboxen sollen extern gesteuert werden.")
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0
      EndIf
      If EventGadget() = 1
      EndIf
      If EventGadget() = 2
      EndIf
  EndSelect
ForEver
End
Und um das Folgende gehts jetzt ....

Code: Alles auswählen

; Codebasis: Ligatur 
; http://forums.purebasic.com/german/viewtopic.php?f=3&t=14851&hilit=fremde+gadgets&sid=1a3309d6a4f7a105bce6c104befafc8f

Declare.l EnumChilds(hwnd, lParam)
ft.s = "Fremdprogramm-Checkbox"
Inhalt.s = "Option1"

hwnd = OpenWindow(0, 20, 20, 300, 150, "Fremdes Stringgadget")
TextGadget(102, 015, 60, 40, 15, "Handle")
StringGadget(3, 060, 60, 80, 20, "", #PB_String_ReadOnly)
TextGadget(103, 155, 60, 40, 15, "Gadget")
StringGadget(4, 200, 60, 80, 20, "", #PB_String_ReadOnly)

;Fenster suchen
fhwnd = FindWindow_(#Null, @ft)
If fhwnd
   ; Fenster existiert
   SetGadgetText(3, Hex(fhwnd))
   ; Nach Gadget mit bestimmten Inhalt(Text) suchen
   If EnumChildWindows_(fhwnd, @EnumChilds(), @Inhalt) = #False  ; Negierte Logik hier !
     MessageRequester("Prima", "Gadget gefunden. :-)", #MB_OK)
     PostMessage_(GetGadgetData(4),#WM_LBUTTONDOWN,0,0)   ; Button press
     PostMessage_(GetGadgetData(4),#WM_LBUTTONUP,0,0)     ; Button release  
   Else
     MessageRequester("Fehler", "Gadget existiert nicht!", #MB_ICONERROR)
   EndIf  
Else
   MessageRequester("Fehler", "Fenster existiert nicht!", #MB_ICONERROR)
EndIf
   
End

Procedure.l EnumChilds(hwnd, lParam)
   ;Fenstertext besorgen
   SendMessage_(hwnd, #WM_GETTEXT, 255, @wt.s{255})
   vt.s = PeekS(lParam)
   If vt = wt   ; Vorgegebenen mit gefundenen Text vergleichen
      WID = GetWindowLong_(hwnd, #GWL_ID)
      SetGadgetText(4, Hex(hwnd) + " / " + Str(WID))
      SetGadgetData(4, hwnd)
      ProcedureReturn #False
   EndIf
   ProcedureReturn #True
EndProcedure
Wie man sieht kann ich Fenster und Gadget finden, und "klicke" dann das Gadget, der Ursprungscode zeigte zusätzlich auch das Ändern der Gadgettexte.
Ich möchte aber die Checkbox definiert setzen, und nicht durch simuliertes Klicken nur togglen.
Das Sahnehäubchen wäre ein Hide-Gadget und/oder ein Getgadgetstate des fremden Gadgets.

Könnte mir da bitte jemand helfen ? Bei den hunderten #WM_XXXX komm ich einfach nicht drauf. :coderselixir:

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Verfasst: 29.07.2012 20:32
von RSBasic

Code: Alles auswählen

SendMessage_(GetGadgetData(4), #BM_SETCHECK, 1, 0)

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Verfasst: 30.07.2012 00:07
von TheCube
Super! Haken setzen/löschen hat sich damit geklärt. :D Da ich mich jetzt im richtigen Bereich umschauen konnte
hier noch ein ergänzendes Schnipsel um mit #BM_GETCHECK den Status auszulesen, um nur zu setzen wenn überhaupt verstellt:

Code: Alles auswählen

     If SendMessage_(GetGadgetData(4), #BM_GETCHECK, 0, 0) = #BST_UNCHECKED
       SendMessage_(GetGadgetData(4), #BM_SETCHECK, 1, 0)    ; Setzen (0 statt 1 zum Haken löschen)
     EndIf  
Wenn jemand noch den "Zauberwert" für Gadget-Hide parat hat, könnte ich mir sogar das pollen sparen:
Haken bei Bedarf setzen, Hide und fertig für die Session.

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Verfasst: 30.07.2012 01:35
von Bisonte
Probiers mit

Code: Alles auswählen

ShowWindow_(GetGadgetData(4),#SW_HIDE)

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Verfasst: 30.07.2012 23:47
von TheCube
@Bisonte: :allright:
@RSbasic: Stellte sich leider heute heraus, das im Fremdprogramm zwar optisch der Haken gesetzt wurde, der aber logisch nicht übernommen wurde.
Jaja, fremde EventLoops sind halt sone Sache ...
Musste es dann doch (erstmal) mit #BM_GETCHECK + bei Bedarf #WM_LBUTTONDOWN/UP lösen.

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Verfasst: 31.07.2012 08:55
von Bisonte
Vielleicht hilft es ja, wenn man einfach ein Fenster über diese Checkbox legt das immer im Vordergrund ist (Mehr oder Weniger durchsichtig),
damit man zwar draufklicken kann, aber man klickt ja auf das selbst erstellte und nicht auf die Checkbox... Banal aber wirkungsvoll....

Oder aber mal versuchen die Checkbox zu deaktivieren (EnableWindow_(GetGadgetData(4),0) ?

So mal als Idee zu DAU Beschützung reinwerf ;)

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Verfasst: 31.07.2012 14:00
von TheCube
Fenster über diese Checkbox legt das immer im Vordergrund ist ... Banal aber wirkungsvoll....
Naja, kann man vielleicht auf festen Fullscreenanwendungen als Idee nehmen .... ich habe aber frei verschiebbare Fenster.

Dafür ist dein Einwurf die Checkbox zu deaktivieren sehr gut. Gefällt mir noch besser als die Box (bei Bedarf vorher korrigiert)auszublenden. 8)