Seite 2 von 2

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 06.03.2013 13:05
von IronEagle
Wenn ich ein solches Problem habe, dann erstelle ich mir einfach das entsprechende Gadget, mache die Änderung und schau im Callback, welche Events vom Gadgets bei der Änderung geschossen werden.
Eine Aufstellung der Events findest du z.B. hier. An den Namen kannst du schon erkennen, was dafür ungefähr in Frage kommen könnte. Dann einfach in deiner fremden Anwendung mit diesen Events durchprobieren.
Bin alle durch und es tut sich leider nichts... Ich mache bestimmt etwas falsch... :(

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 06.03.2013 13:43
von Josh
Nimm diesen Beispielcode. Dann schaust dir die Ereignisse an. Ereignisse die nicht in Frage kommen und massenhaft geschossen werden, die schreibst ins Select rein (wie z.b. das #WM_Paint), damit sie nicht mehr angezeigt werden. Zum Schluß bleibt dir wahrscheinlich noch eine Hand voll Events über, die du dann in deinem externen Programm durchprobieren musst.

Code: Alles auswählen

EnableExplicit

Global OldWndProc

Procedure Hook (hWnd, uMsg, wParam, lParam)

  Select uMsg
    Case #WM_PAINT
    Default : Debug uMsg
  EndSelect

  ProcedureReturn CallWindowProc_(OldWndProc, hWnd, uMsg, wParam, lParam)

EndProcedure

OpenWindow(0, 0, 0, 200, 250, "DateGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
DateGadget(0, 10, 10, 180, 25, "Datum: %mm/%dd/%yyyy Time: %hh:%ii")

OldWndProc = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @Hook())

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow


Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 06.03.2013 14:20
von IronEagle
Also ich denke es sollte die #WM_NOTIFY sein.
Aber selbst wenn ich diese an das andere Programm schicke, passiert nichts.

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 06.03.2013 14:46
von Josh
Wenn du in deinem Originalprogramm eine Änderung des Datums machst, wann wird das im Kalender übernommen? Sofort bei jeder Änderung oder erst wenn du das Dategadget verläßt?

Um welches Programm handelt es sich eigentlich?

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 06.03.2013 14:50
von IronEagle
Wenn du in deinem Originalprogramm eine Änderung des Datums machst, wann wird das im Kalender übernommen? Sofort bei jeder Änderung oder erst wenn du das Dategadget verläßt?
Es wird sofort geändert. An dieses Gadget ist halt ein Kalender geknüpft, der sich dann auf das eingestellte Datum stellt. (Das passiert noch nicht)
Um welches Programm handelt es sich eigentlich?
Das Programm heißt "InfoBoard", hier der Link http://www.infoboard.biz/de/

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 06.03.2013 21:49
von Mr.L
Ich behaupte einfach mal, dass es ohne Weiteres nicht möglich ist, so von Aussen auf das fremde Programm einzuwirken.
(Es sei denn, es werden speziell dafür irgendwelche Schnittstellen zur Verfügung gestellt.)

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 07.03.2013 03:01
von Josh
Ob es möglich ist oder nicht, ist ein Kapitel. Um weiter darauf einzugehen, fehlen einfach die Infos.

Re: DateGadget in einem anderen Programm verändern ?

Verfasst: 11.03.2013 09:25
von IronEagle
Ob es möglich ist oder nicht, ist ein Kapitel. Um weiter darauf einzugehen, fehlen einfach die Infos.
Habe ich vergessen Euch entsprechende Infos zu geben ? Wenn dem so sein sollte, entschuldigt bitte.

Hier die entsprechenden Sourcecodes die ich zum testen verwende. Ich hoffe die können Euch weiterhelfen.

Mit dem folgenden Code teste ich das setzen eines DateGadgets innerhalb eines anderen Programms.
(Das Gadget wird auch gesetzt, aber ich erhalte nicht wie benötigt in diesem Programm einen entsprechenden Event.)

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
Mit dem folgenden Code setze ich das Gadget.

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
          CloseHandle_(phwnd)
        EndIf
      EndIf
    EndIf
  EndIf
EndProcedure 

Set(12.09.2012)