GadgetEvent in einem anderen Programm auslösen ?

Anfängerfragen zum Programmieren mit PureBasic.
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

GadgetEvent in einem anderen Programm auslösen ?

Beitrag von IronEagle »

Hallo Leute,

kennt jemand eine Weg, wie ich in einem anderen Programm einen GadgetEvent auslösen kann?
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von RSBasic »

SendMessage_()
Am besten suchst du im Forum. Da gibt es viele Beispielcodes diesbezüglich, wie man z.B. einen Buttonklick auslöst o.ä.

\\Edit:
Wie z.B.: SendMessage_(Handle, #BM_CLICK, #null, #null)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von IronEagle »

RSBasic hat geschrieben:SendMessage_()
Am besten suchst du im Forum. Da gibt es viele Beispielcodes diesbezüglich, wie man z.B. einen Buttonklick auslöst o.ä.

\\Edit:
Wie z.B.: SendMessage_(Handle, #BM_CLICK, #null, #null)
Eine Frage, schicke ich die Message an das Fenster oder an das Gadget selbst?
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von RSBasic »

Wenn du beispielsweise einen #BM_CLICK auslösen möchtest, dann direkt beim Button im jeweiligen Fenster.
Um die Handle-Nummer zu erhalten, musst du zuerst die Handle-Nummer des Hauptfensters und dann als Child den Button ermitteln.
Etwa so: http://www.rsbasic.de/aktualisierung/wi ... stecken.pb
Zuerst mit FindWindow_() die Nummer des Fensters ermitteln und anhand dieser Nummer kannst du die einzelnen Controls ansprechen.

Wenn du z.B. Menüpunkte ansprechen möchtest, dann direkt beim Fenster: http://www.rsbasic.de/aktualisierung/wi ... 3%B6sen.pb
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von IronEagle »

RSBasic hat geschrieben:Wenn du beispielsweise einen #BM_CLICK auslösen möchtest, dann direkt beim Button im jeweiligen Fenster.
Um die Handle-Nummer zu erhalten, musst du zuerst die Handle-Nummer des Hauptfensters und dann als Child den Button ermitteln.
Etwa so: http://www.rsbasic.de/aktualisierung/wi ... stecken.pb
Zuerst mit FindWindow_() die Nummer des Fensters ermitteln und anhand dieser Nummer kannst du die einzelnen Controls ansprechen.

Wenn du z.B. Menüpunkte ansprechen möchtest, dann direkt beim Fenster: http://www.rsbasic.de/aktualisierung/wi ... 3%B6sen.pb
Das habe ich soweit verstanden :)

Wenn ich jetzt aber in einem anderen Fenster ein DateGadget verändert habe und dem Programm mitteilen möchte, dass sich der Inhalt des DateGadget geändert hat, schicke ich dann eine Nachricht an das Gadget oder das Fenster?

Ich würde sagen:

1. Nachricht an das Gadget mit dem neuen Inhalt.
2. Nachricht an das Fenster, dass sich der Inhalt des Gadgets geändert hat ?

Die erste Nachricht funktioniert bereits. Mein Problem besteht darin, das ich nicht weiß, wie ich die Zweite Message senden muss.
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von RSBasic »

Da ich das grad' nicht testen kann, kannst du mal folgendes probieren:

Code: Alles auswählen

SendMessage_(handle, #WM_NCPAINT, 1, 0)
Oder:

Code: Alles auswählen

InvalidateRect_(handle, 0, #True)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von IronEagle »

Funktioniert leider nicht... :(

Hier mal meine beiden beispielcodes.

Wenn alles klappt, müsste das erste Programm im Listview einen Event anzeigen, so als hätte man das Datum manuell verändert.

Code: Alles auswählen

Enumeration #PB_Compiler_EnumerationValue
  #Window_0
  #Listview_0
  #Date_0
EndEnumeration

Procedure OpenWindow_0()
  If OpenWindow(#Window_0, 0, 0, 200, 260, "Date 1.0", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    DateGadget(#Date_0, 10, 20, 180, 20, "")
    ListViewGadget(#Listview_0, 10, 50, 180, 200)
  EndIf
EndProcedure

OpenWindow_0()

Repeat
  WindowEvent = WaitWindowEvent(50)
  Select WindowEvent
    Case #PB_Event_Gadget
      GadgetEvent = EventGadget()
      Select GadgetEvent
        Case #Date_0
          AddGadgetItem(#Listview_0, -1, FormatDate("%hh:%ii", Date()) + " -> Event " + Str(Counter.l))
          Counter.l + 1
        Case #Listview_0
          Select EventType()
            Case #PB_EventType_LeftDoubleClick
              ClearGadgetItems(#Listview_0)
          EndSelect   
      EndSelect   
  EndSelect   
Until WindowEvent = #PB_Event_CloseWindow

Code: Alles auswählen

Global hwnd

Procedure EnumWindows(whwnd)
  Protected title$ = Space(1024)
  If IsWindowVisible_(whwnd)
    GetWindowText_(whwnd, @title$, 1024)
    If title$ = "Date 1.0"
      hwnd = whwnd     
    EndIf 
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure Set(Day.w, Month.w, Year.w)
  Protected ghwnd, phwnd, pid, sysTime.SYSTEMTIME, *mem
  EnumWindows_(@EnumWindows(),#True)
  If hwnd
    ghwnd = FindWindowEx_(hwnd, #Null, "SysDateTimePick32", #Null)
    If ghwnd
      If GetWindowThreadProcessId_(ghwnd, @pid)
        phwnd = OpenProcess_(#PROCESS_ALL_ACCESS, 0, pid)
        If phwnd
          sysTime\wYear = Year.w
          sysTime\wMonth = Month.w
          sysTime\wDay = Day.w
          *mem = VirtualAllocEx_(phwnd, #Null, SizeOf(SYSTEMTIME), #MEM_COMMIT, #PAGE_READWRITE)
          If *mem
            WriteProcessMemory_(phwnd, *mem, @sysTime, SizeOf(SYSTEMTIME), #Null)
            SendMessage_(ghwnd, #DTM_SETSYSTEMTIME, 0, *mem)
            VirtualFreeEx_(phwnd, *mem, SizeOf(Integer), #MEM_RELEASE)
          EndIf
          SendMessage_(hwnd, #WM_NCPAINT, 1, 0)
          CloseHandle_(phwnd)
        EndIf
      EndIf
    EndIf
  EndIf
EndProcedure 

Set(12.09.2012)
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von RSBasic »

Code: Alles auswählen

Global hwnd

Procedure SimulateGadgetEvent( GadgetID , EventType )
  PokeW ( @wp+0, GadgetID )
  PokeW ( @wp+2, EventType )
  lp=GadgetID
  gadgetOwner = GetAncestor_ (lp,2)
  PostMessage_ (gadgetOwner, #WM_COMMAND ,wp,lp)
EndProcedure

Procedure EnumWindows(whwnd)
  Protected title$ = Space(1024)
  If IsWindowVisible_(whwnd)
    GetWindowText_(whwnd, @title$, 1024)
    If title$ = "Date 1.0"
      hwnd = whwnd     
    EndIf
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure Set(Day.w, Month.w, Year.w)
  Protected ghwnd, phwnd, pid, sysTime.SYSTEMTIME, *mem
  EnumWindows_(@EnumWindows(),#True)
  If hwnd
    ghwnd = FindWindowEx_(hwnd, #Null, "SysDateTimePick32", #Null)
    If ghwnd
      If GetWindowThreadProcessId_(ghwnd, @pid)
        phwnd = OpenProcess_(#PROCESS_ALL_ACCESS, 0, pid)
        If phwnd
          sysTime\wYear = Year.w
          sysTime\wMonth = Month.w
          sysTime\wDay = Day.w
          *mem = VirtualAllocEx_(phwnd, #Null, SizeOf(SYSTEMTIME), #MEM_COMMIT, #PAGE_READWRITE)
          If *mem
            WriteProcessMemory_(phwnd, *mem, @sysTime, SizeOf(SYSTEMTIME), #Null)
            SendMessage_(ghwnd, #DTM_SETSYSTEMTIME, 0, *mem)
            VirtualFreeEx_(phwnd, *mem, SizeOf(Integer), #MEM_RELEASE)
          EndIf
          SimulateGadgetEvent(ghwnd, 0)
          CloseHandle_(phwnd)
        EndIf
      EndIf
    EndIf
  EndIf
EndProcedure

Set(12,09,2012)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von IronEagle »

Danke :bounce:

Genau das habe ich gesucht :)
PureBasic 5.71 | Windows 10 Home (x64)
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: GadgetEvent in einem anderen Programm auslösen ?

Beitrag von Mr.L »

EnumWindows verlangt 2 Parameter. Die Procedure müsste so aussehen (sonst gibts evtl. IMA):

Code: Alles auswählen

Procedure EnumWindows(whwnd, lparam)
  If IsWindowVisible_(whwnd)
    Protected title$ = Space(1024)
    GetWindowText_(whwnd, @title$, 1024)
    If title$ = "Date 1.0"
    	hwnd = whwnd
    	ProcedureReturn #False
    EndIf
  EndIf
  ProcedureReturn #True
EndProcedure
Allerdings kannst du auch komplett drauf verzichten wenn du

Code: Alles auswählen

hwnd = FindWindow_(#Null, @"Date 1.0")
aufrufst.
Antworten