DateGadget in einem anderen Programm verändern ?

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

Re: DateGadget in einem anderen Programm verändern ?

Beitrag 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... :(
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: DateGadget in einem anderen Programm verändern ?

Beitrag 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

IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: DateGadget in einem anderen Programm verändern ?

Beitrag von IronEagle »

Also ich denke es sollte die #WM_NOTIFY sein.
Aber selbst wenn ich diese an das andere Programm schicke, passiert nichts.
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: DateGadget in einem anderen Programm verändern ?

Beitrag 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?
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: DateGadget in einem anderen Programm verändern ?

Beitrag 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/
PureBasic 5.71 | Windows 10 Home (x64)
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: DateGadget in einem anderen Programm verändern ?

Beitrag 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.)
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: DateGadget in einem anderen Programm verändern ?

Beitrag von Josh »

Ob es möglich ist oder nicht, ist ein Kapitel. Um weiter darauf einzugehen, fehlen einfach die Infos.
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: DateGadget in einem anderen Programm verändern ?

Beitrag 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)
PureBasic 5.71 | Windows 10 Home (x64)
Antworten