Seite 1 von 2

Systrayicons werden nach Explorer Crash nicht angezeigt

Verfasst: 09.12.2007 13:03
von Scarabol
Hi Leute,

wenn der Explorer zusammenbricht verschwindet ja auch kurzzeitig die Systray und nach dem neuladen werden auch alle icons wieder angezeigt außer die meiner PB Programme.

Sollte also PB intern geregelt werden, das die Icons wieder hinzugefügt werden, denn die Programme laufen noch!

Gruß
Scarabol

Verfasst: 09.12.2007 13:26
von AND51
Sollte nicht PB intern geregelt werden, denn dieses Problem tritt auch mit vielen nicht PB-Programmen auf u. a. auch AntiVir, wenn ich mich recht erinnere.
Fakt ist, da machst du nichts dran, egal, was du probierst.
Übrigens muss es nicht immer ein Explorer-Absturz sein, man kann den Prozess explorer.exe auch ganz normal im Taskmanager killen um das Poblem hervorzurufen.

Verfasst: 09.12.2007 18:22
von Scarabol
Also die etwas professionelleren Programme kommen ohne Probleme damit klar....
Darunter:
- Skype
- Miranda
- AntiVir
- Fritz.Box StartCenter

Ähm wieso soll ich was daran machen?
Das ist doch eher das Problem von PB...

Gruß
Scarabol

Verfasst: 09.12.2007 19:38
von mk-soft
Gebe Andy recht.
kannst ja probieren das zu lösen und bei erfolg uns mitteilen :allright:

Verfasst: 09.12.2007 20:25
von marco2007
...bei mir kommen wieder alle Icons...

Code: Alles auswählen

 ;http://www.purearea.net/pb/CodeArchiv/Windows_System/Tasks&Processes/KillProcess.pb 

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=8086&start=15 
; Author: Hi-Toro 
; Date : 30. November 2003 
; OS : Windows 
; Demo : No 

; ------------------------ Get PID 
Structure PROCESSENTRY32s 
  dwsize.l 
  cntusage.l 
  th32ProcessID.l 
  th32DefaultHeapID.l 
  th32ModuleID.l 
  cntThreads.l 
  th32ParentProcessID.l 
  pcPriClassBase.l 
  dwFlags.l 
  szExeFile.s{1024} 
EndStructure 
#TH32CS_SNAPPROCESS = $2 

Procedure.l FindPid(s.s) 
  Process.PROCESSENTRY32s 
  ProcSnap.l 
  ProcSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0) 
  If ProcSnap <> 0 
    Process\dwsize=SizeOf(Process) 
    Process32First_(ProcSnap, Process) 
    While Process32Next_(ProcSnap, Process) > 0 
      If Process\szExeFile = s 
        ProcedureReturn Process\th32ProcessID 
        Break 
      EndIf 
    Wend 
  EndIf 
EndProcedure 
; --------------------- Get PID end 

; Take a look at ListTaskbarWindows.pb before... 
; ... and if a program refuses to close like that, you could instead 'force' it closed 
; via this, passing the 'pid' variable from the above code : 

#PROCESS_TERMINATE = $1 
#PROCESS_CREATE_THREAD = $2 
#PROCESS_VM_OPERATION = $8 
#PROCESS_VM_READ = $10 
#PROCESS_VM_WRITE = $20 
#PROCESS_DUP_HANDLE = $40 
#PROCESS_CREATE_PROCESS = $80 
#PROCESS_SET_QUOTA = $100 
#PROCESS_SET_INFORMATION = $200 
#PROCESS_QUERY_INFORMATION = $400 
#PROCESS_ALL_ACCESS = #STANDARD_RIGHTS_REQUIRED|#SYNCHRONIZE|$FFF 

; This appears to be pretty much how Windows kills a program if you 'End Process' 
; from the Task Manager. Note that this is 'unfriendly'! 

Procedure KillProcess(pid) 
  phandle = OpenProcess_(#PROCESS_TERMINATE, #False, pid) 
  If phandle <> #Null 
    If TerminateProcess_(phandle, 1) 
      result = #True 
    EndIf 
    CloseHandle_(phandle) 
  EndIf 
  ProcedureReturn result 
EndProcedure 

; Enter process ID here! I suggest going to Task Manager, 
; making sure PIDs are shown (try View menu -> Select columns if 
; they are not listed), then run a program and enter its number here... 

KillProcess(FindPid("explorer.exe"))
Delay(200)
RunProgram("explorer.exe")

Verfasst: 09.12.2007 20:27
von Scarabol
Hi marco,

dann kill doch mal bitte den Explorer über den Taskmanager und guck ob die mit PB programmierten Anwendungen ihre Icons auch wieder anzeigen...

Gruß
Scarabol

Verfasst: 09.12.2007 20:53
von marco2007
Hast recht, ...ich glaube, wenn explorer crasht und neu gestartet wird, beginnt er quasi wie bei einem Windowsstart -> er startet die selben Programme und somit lädt er die gleichen Icons....

Verfasst: 09.12.2007 21:01
von Scarabol
Ne leider nicht, denn die Programme die bei mir nicht mehr angezeigt werden sind auch im Autostart...

Gruß
Scarabol

Verfasst: 09.12.2007 21:58
von Andreas
AND51 hat geschrieben:Fakt ist, da machst du nichts dran, egal, was du probierst.
Damit bin ich aber nicht einverstanden !

Das ist abzufangen.
Immer wenn der Explorer crasht sendet er eine registrierte Message ("TaskbarCreated")
an alle Toplevel-Fenster.
Es muss also eine Message registriert, und im FensterCallback darauf reagiert werden. Dann erscheint das Icon auch wieder !

Beispiel :

Code: Alles auswählen

Procedure WCB (wnd,msg,wParam,lParam)
  Shared TB_Created
  Result = #PB_ProcessPureBasicEvents
  Select msg
  Case TB_Created
    AddSysTrayIcon(1, WindowID(0), LoadImage(0,#PB_Compiler_Home +"examples\sources\Data\CdPlayer.ico"))
  EndSelect
  ProcedureReturn Result
EndProcedure

TB_Created.l = RegisterWindowMessage_("TaskbarCreated")

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)
  AddSysTrayIcon(1, WindowID(0), LoadImage(0,#PB_Compiler_Home +"examples\sources\Data\CdPlayer.ico"))
  SysTrayIconToolTip(1, "Icon 1")
  SetWindowCallback(@wcb())
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_SysTray
      If EventType() = #PB_EventType_LeftDoubleClick
        MessageRequester("SysTray", "Left DoubleClick on SysTrayIcon "+Str(EventGadget()),0)
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

Verfasst: 09.12.2007 22:11
von marco2007
@Andreas: :allright: