GadgetEvent in einem anderen Programm auslösen ?
GadgetEvent in einem anderen Programm auslösen ?
Hallo Leute,
kennt jemand eine Weg, wie ich in einem anderen Programm einen GadgetEvent auslösen kann?
kennt jemand eine Weg, wie ich in einem anderen Programm einen GadgetEvent auslösen kann?
PureBasic 5.71 | Windows 10 Home (x64)
Re: GadgetEvent in einem anderen Programm auslösen ?
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)
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 ?
Eine Frage, schicke ich die Message an das Fenster oder an das Gadget selbst?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)
PureBasic 5.71 | Windows 10 Home (x64)
Re: GadgetEvent in einem anderen Programm auslösen ?
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
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 ?
Das habe ich soweit verstandenRSBasic 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

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)
Re: GadgetEvent in einem anderen Programm auslösen ?
Da ich das grad' nicht testen kann, kannst du mal folgendes probieren:
Oder:
Code: Alles auswählen
SendMessage_(handle, #WM_NCPAINT, 1, 0)
Code: Alles auswählen
InvalidateRect_(handle, 0, #True)
Re: GadgetEvent in einem anderen Programm auslösen ?
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.

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)
Re: GadgetEvent in einem anderen Programm auslösen ?
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 ?
Danke
Genau das habe ich gesucht

Genau das habe ich gesucht

PureBasic 5.71 | Windows 10 Home (x64)
Re: GadgetEvent in einem anderen Programm auslösen ?
EnumWindows verlangt 2 Parameter. Die Procedure müsste so aussehen (sonst gibts evtl. IMA):
Allerdings kannst du auch komplett drauf verzichten wenn du
aufrufst.
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
Code: Alles auswählen
hwnd = FindWindow_(#Null, @"Date 1.0")