Seite 1 von 1

GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 09:19
von IronEagle
Hallo Leute,

kennt jemand eine Weg, wie ich in einem anderen Programm einen GadgetEvent auslösen kann?

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 09:57
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)

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 10:15
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?

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 11:04
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

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 11:15
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.

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 11:24
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)

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 11:33
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)

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 12:08
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)

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 16:12
von IronEagle
Danke :bounce:

Genau das habe ich gesucht :)

Re: GadgetEvent in einem anderen Programm auslösen ?

Verfasst: 11.03.2013 21:48
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.