小弟初学api,但有一作业今天晚上急要,所有请大家帮忙解决.
'窗体
Private Sub Form_Load()
Call EnableKBDHook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub
'模板
Option Explicit
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 CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const WH_SYSMSGFILTER = 6
Public Const EWX_SHUTDOWN = 1
Public hHook As Long
Public hnexthookproc As LongPublic Const WH_CALLWNDPROC = 4
Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <> 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf _
WindowProc, App.hInstance, 0)
End Function
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If (uMsg = WM_QUERYENDSESSION) Then
WindowProc = 0
WindowProc = CallWindowProc(hHook, hw, uMsg, wParam, lParam)
Else
WindowProc = CallWindowProc(hHook, hw, uMsg, wParam, lParam)
End If
End Function
怎么可以实现让我的系统无法关机.
先谢谢各位了.里面的错误尽管指出,不胜感激.
'窗体
Private Sub Form_Load()
Call EnableKBDHook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub
'模板
Option Explicit
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 CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Public Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const WH_SYSMSGFILTER = 6
Public Const EWX_SHUTDOWN = 1
Public hHook As Long
Public hnexthookproc As LongPublic Const WH_CALLWNDPROC = 4
Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <> 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf _
WindowProc, App.hInstance, 0)
End Function
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If (uMsg = WM_QUERYENDSESSION) Then
WindowProc = 0
WindowProc = CallWindowProc(hHook, hw, uMsg, wParam, lParam)
Else
WindowProc = CallWindowProc(hHook, hw, uMsg, wParam, lParam)
End If
End Function
怎么可以实现让我的系统无法关机.
先谢谢各位了.里面的错误尽管指出,不胜感激.
解决方案 »
- 新手求助
- 用纯C语言写了一个HtmlParse(网页分析器)外带采集功能,大小只有200K(免费+开源+操作示意图)
- 用VB做了个插件,可出现“Activex部件不能创建对象”的错误提示,求助
- 求票据打印的相关资料
- 问一个问题~请高手们近来帮帮我吧~
- 关于 Int 与 Fix 的一个问题
- 怎样实现图像的平滑放大?
- 求助:如何在VB代碼中修改Crystal Reports的連線字串ConnectionString
- 怎样取得HTMLBody或HTMLDocumnet中的网页标签?
- 请问如何在文本框内读入注册表的某个键值,谢谢
- 关于VB控制Word ,Excle 打印的问题,知道的兄弟进来一下。
- 枕善居发布第一批16*16真彩色icon
gHW = Me.hwnd
Hook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Unhook
End Sub模块里面
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
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As LongType POINTAPI
x As Long
y As Long
End TypeType MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End TypePublic Const GWL_WNDPROC = -4
Public Const WM_QUERYENDSESSION = &H11
Global Const WM_CANCELMODE = &H1FPublic SDAttempted As Long
Global lpPrevWndProc As Long
Global gHW As LongPublic Sub Hook()
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
End SubPublic Sub Unhook()
Dim temp As Long
temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As _
Long
Dim a As Long
If uMsg = WM_QUERYENDSESSION Then
SDAttempted = SDAttempted + 1
frmMain.lblSDs.Caption = SDAttempted & " Time(s)."
WindowProc = CallWindowProc(lpPrevWndProc, hw, _
WM_CANCELMODE, wParam, wParam)
MsgBox "Windows made an attempt to shutdown !", vbInformation, "Shutdown-Attempt"
Exit Function
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, _
uMsg, wParam, lParam)
End Function
你还在吗??
我的电脑还是关掉了,可以再帮我看看不.
大家帮忙,多少分不是问题,我还有大几百分.
如果系统调用了exitwindowsex函数我们就取消这个动作.
写字楼里写字间,写字间里程序员;
程序人员写程序,又拿程序换酒钱。
酒醒只在网上坐,酒醉还来网下眠;
酒醉酒醒日复日,网上网下年复年。
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员。
别人笑我忒疯癫,我笑自己命太贱;
不见满街漂亮妹,哪个归得程序员。
’以下在Form
Private Sub Form_Load()
Dim ret As Long ’记录原来的Window Procedure的位址
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
’设定form的window Procedure到wndproc
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
Dim fno As Long ’取消Message的截取,而使之又只送往原来的Window Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc) ’这里只是要看看用关机的方式结束程序时,会不会执行到这里
fno = FreeFile
Open "c:\tt2" For Append As fno
Print #fno, "ccc" + vbCrLf
Close #fno
End Sub
’以下在.Bas
Option Explicit
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 Const GWL_WNDPROC = (-4)
Public Const WM_ENDSESSION = &H16
Public Const WM_QUERYENDSESSION = &H11
Public preWinProc As Long
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_QUERYENDSESSION Then
Debug.Print "QryEnd", wParam, lParam
Else
If Msg = WM_ENDSESSION Then
If wParam 0 Then ’代表将顺利关机或LogOff,这时便得做正常结束程序的操作
Dim fno As Long
Open "c:\ttt" For Output As #1
Print #1, "hahcccc5"
Close #1
End If
End If
End If ’将之送往原来的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function