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

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:
