Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hide ?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hide ?

Beitrag 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:
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Beitrag von RSBasic »

Code: Alles auswählen

SendMessage_(GetGadgetData(4), #BM_SETCHECK, 1, 0)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Beitrag von Bisonte »

Probiers mit

Code: Alles auswählen

ShowWindow_(GetGadgetData(4),#SW_HIDE)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Bei Fremdprogramm Checkboxgadget Status Set/Get oder Hid

Beitrag 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)
Antworten