Gå til innhold

Windows Hooks, WH_SYSMSGFILTER...


Anbefalte innlegg

her e koden min:

Dim lOldWindowProc As Long, lHookID As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Const WH_SYSMSGFILTER As Long = 6
Public Type POINTAPI
   x As Long
   y As Long
End Type
Public Type MSG
   hwnd As Long
   message As Long
   wParam As Long
   lParam As Long
   time As Long
   pt As POINTAPI
End Type

Public Function Terminate()
UnhookWindowsHookEx lHookID
End Function

Sub Main()
App.TaskVisible = False
lHookID = SetWindowsHookEx(WH_SYSMSGFILTER, AddressOf HookProc, App.hInstance, App.ThreadID)
SetWindow True, Form1.hwnd
MsgBox Hex(lHookID) & vbNewLine & Hex(lOldWindowProc)
End Sub

Public Function HookProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim HookMsg As MSG
CopyMemory HookMsg, lParam, Len(HookMsg)
   Select Case HookMsg.message
       Case &H11: HookProc = 0
           Debug.Print "HookProc destroy shutdown"
       Case Else: HookProc = CallNextHookEx(lHookID, ncode, wParam, lParam)
           Debug.Print HookMsg.message
   End Select
End Function

Public Function SetWindow(ByVal Register As Boolean, hwnd As Long) As Long
Dim Ret As Long
   If Register Then
       lOldWindowProc = SetWindowLong(hwnd, -4, AddressOf WindowProc)
   Else
       Ret = SetWindowLong(hwnd, GWL_WNDPROC, lOldWindowProc)
   End If
   If Ret = 0 Then
       SetWindow = lOldWindowProc
   Else
       SetWindow = Ret
   End If
End Function

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case uMsg
       Case &H11: WindowProc = 0
           Debug.Print "WindowProc destroy shutdown"
       Case Else: WindowProc = CallWindowProc(lOldWindowProc, hwnd, uMsg, wParam, lParam)
   End Select
End Function

Noen som kan forklare hvorfor lHookID altid er 0?

 

Problemet mitt er at PC'en min skrur seg av hele tiden, uten kontroll...

 

WindowProc fungerer, pc'en skrur seg ikke av, men den begynner, og en hel del viktige programmer blir avsluttet før programmet mitt stopper det...

Lenke til kommentar
Videoannonse
Annonse

WM_QUERYENDSESSION blir sendt til alle applikasjoner imens systemet avsluttes. Derfor kan du risikere at mange applikasjoner informerer systemet at de er klar for å avslutte lenge før din applikasjon blir informert om dette. Muligens kan en endre din applikasjons prioritet, men kanskje det letteste blir å ganske enkelt eksekvere de eventuele programmer som rakk å bli avsluttet før du greide å stoppe avsluttingsprosessen. Lagre simpelthen en liste over alle programmer ved jevne mellomrom, og dette skulle være en smal sak.

Lenke til kommentar
Er det ikke bedre å finne ut hvorfor pc'en starter nedstenging? Det finnes jo flere virus som gjør dette.

5377569[/snapback]

 

Jo, er helt enig, na har det seg sann, at jeg ikke greier og finne det ut, og vis jeg far til og lage et programm som avbryter nedstengningen, sa far jeg litt bedre tid...

 

Na funker programmet mitt da, delvis ivertfall, men jeg ville satt pris pa et konstruktivt innlegg i hvordan jeg kan fa WH_SYSMSGFILTER til og virke, eventuelt hvorfor det ikke virker...

 

Men for all del, takk for all respons...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...