Code: Select all
;http://pbasic.spb.ru/phpBB2/viewtopic.php?t=1066
; Author: kvitaliy 2010
; PureBasic v 4.4
#IOCTL_DISK_PERFORMANCE = $70020;
Structure DISK_PERFORMANCE
BytesRead.q;
BytesWritten.q;
ReadTime.q;
WriteTime.q;
IdleTime.q;
ReadCount.l;
WriteCount.l;
QueueDepth.l;
SplitCount.l;
QueryTime.l;
StorageDeviceNumber.l;
StorageManagerName.l[8];
EndStructure
SystemPath.s=Space(255)
Result=GetSystemDirectory_(SystemPath.s,255)
Global hdh
;Procedure ScrollLock-blinken
Procedure SetScrollLED(VKkey.l, bState.b)
Dim keyState.b(256)
GetKeyboardState_(@keyState(0))
If (bState = #True And keyState(VKkey) = 0) Or (bState = #False And keyState(VKkey) = 1)
keybd_event_(VKkey, 0, #KEYEVENTF_EXTENDEDKEY, 0)
keybd_event_(VKkey, 0, #KEYEVENTF_EXTENDEDKEY + #KEYEVENTF_KEYUP, 0)
keyState(VKkey) = bState
SetKeyboardState_(@keyState(0))
EndIf
EndProcedure
Procedure OpenPhysDrive(CurrentDrive.l)
hdh = CreateFile_("\\.\PhysicalDrive" + Str(CurrentDrive),0,0,0,#OPEN_EXISTING, 0, 0)
ProcedureReturn hdh
EndProcedure
;Prüft, ob eine physische Festplatte im System nach 0 (neben 1 Disc, etc.)
If OpenPhysDrive(0) = #INVALID_HANDLE_VALUE
End ; es gibt keinen Ausstieg aus dem Programm-CD
EndIf
; Programm-Icon in der Taskleiste wird aus der System-DLL übernommen
IdIcon1=ExtractIcon_(0,SystemPath+"\SetupAPI.dll",29)
IdIcon2=ExtractIcon_(0,SystemPath+"\SetupAPI.dll",8)
dp.DISK_PERFORMANCE
Window_Form1=OpenWindow(0,80,80,100,100,"HDD",#PB_Window_Invisible)
CreatePopupMenu(0)
MenuItem(1, "Über")
MenuItem(2, "Beenden")
AddSysTrayIcon(1, WindowID(0),IdIcon2) ;
SysTrayIconToolTip(1, "HDD Monitor")
Repeat
EventID = WaitWindowEvent(10)
Result=DeviceIoControl_(hdh, #IOCTL_DISK_PERFORMANCE, 0, 0, @dp, SizeOf(DISK_PERFORMANCE), @lBytesReturned, 0);
; Wenn sich Dauer des Lesen verändert
If dp\ReadTime <> OldReadTime.q; Wenn gelesen wird - LED-Anzeige-Symbol blinken lassen
OldReadTime = dp\ReadTime
If Not flags
SetScrollLED(#VK_SCROLL,#True)
ChangeSysTrayIcon(1,IdIcon2)
flags = #True
EndIf
Else
If flags
SetScrollLED(#VK_SCROLL,#False)
ChangeSysTrayIcon(1,IdIcon1)
flags = #Null
EndIf
EndIf
; Wenn sich Dauer des Screiben verändert
If dp\WriteTime<>OldWriteTime.q ;Wenn geschrieben wird - LED-Anzeige-Symbol blinken lassen
OldWriteTime= dp\WriteTime
If Not flags
SetScrollLED(#VK_SCROLL,#True)
ChangeSysTrayIcon(1,IdIcon2)
flags = #True
EndIf
Else
If flags
SetScrollLED(#VK_SCROLL,#False)
ChangeSysTrayIcon(1,IdIcon1)
flags = #Null
EndIf
EndIf
Delay (100)
If ElapsedMilliseconds() > TimeOut
If TimeOut
SysTrayIconToolTip(1, "HDD Monitor R:" + Str((dp\ReadCount - Count_Read)*12) + " (" + StrU(dp\BytesRead/$100000, #pb_quad) + "MB) | W:" + Str((dp\WriteCount - Count_Write)*12) + " (" + StrU(dp\BytesWritten/$100000, #pb_quad) + "MB) [Req/min]")
EndIf
Count_Read = dp\ReadCount
Count_Write = dp\WriteCount
TimeOut = ElapsedMilliseconds() + 5000
EndIf
If EventID = #PB_Event_SysTray
Select EventType()
Case #PB_EventType_RightClick ;Die Verarbeitung der rechten Maustaste
DisplayPopupMenu(0, WindowID(0)) ;zeige Popup-Menü
EndSelect
EndIf
If EventID = #PB_Event_Menu
Select EventMenu()
Case 2
Quit = 1
Case 1
MessageRequester("HDD", "HDD Activity LED", #PB_MessageRequester_Ok)
EndSelect
EndIf
If EventID = #PB_Event_CloseWindow ; Beenden Sie das Programm
Quit = 1
EndIf
Until Quit = 1
SetScrollLED(#VK_SCROLL,#False)