我在我的应用程序中使用一个名为Kiosk的.dll,它可以禁用某些键盘键。我这样做......
using Kiosk;
-----
public static Kiosk.Kiosk KIOSK = new Kiosk.Kiosk();
-----
static void Main()
{
KIOSK.Disable();
}
我在Program.cs和我表单的所有其他页面加载中都这样调用。我想在全局范围内只调用一次这个函数。在我的应用程序中调用它来禁用我的键盘键的地方。
我认为Program.cs是全局调用该方法的正确位置。但是如果我只在那里调用这种方法,那就非常有效。
请帮忙。感谢。
Kiosk.dll包含以下VB代码: 这段代码完美无缺。我在上面的应用程序中调用了Disable()方法。
Option Explicit On
Option Strict On
Imports Microsoft.Win32
Imports System.Runtime.InteropServices
Public Class Kiosk
Implements IDisposable
#Region "IDisposable"
' Implementing IDisposable since it might be possible for
' someone to forget to cause the unhook to occur. I didn't really
' see any problems with this in testing, but since the SDK says
' you should do it, then here's a way to make sure it will happen.
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
If disposing Then
' Free other state (managed objects).
End If
If m_hookHandle <> 0 Then
UnhookWindowsHookEx(m_hookHandle)
m_hookHandle = 0
End If
If m_taskManagerValue > -1 Then
EnableTaskManager()
End If
End Sub
Protected Overrides Sub Finalize()
Dispose(False)
End Sub
#End Region
Private Delegate Function LowLevelHookDelegate(ByVal code As Integer, ByVal wParam As Integer, ByRef lParam As KeyboardLowLevelHookStruct) As Integer
Private Const Hc_Action As Integer = 0
Private Const WindowsHookKeyboardLowLevel As Integer = 13
Private Const LowLevelKeyboardHfAltDown As Integer = &H20
Private Enum WindowsMessage
KeyDown = &H100
KeyUp = &H101
SystemKeyDown = &H104
SystemKeyUp = &H105
End Enum
Private Enum Vk
Tab = &H9
Escape = &H1B
Shift = &H10
Control = &H11
Menu = &H12 ' ALT key.
Alt = &H12
Pause = &H13
LeftWindows = &H5B ' Left Windows key (Microsoft® Natural® keyboard).
RightWindows = &H5C ' Right Windows key (Natural keyboard).
Applications = &H5D ' Applications key (Natural keyboard).
End Enum
Private Structure KeyboardLowLevelHookStruct
Public VirtualKeyCode As Integer
Public ScanCode As Integer
Public Flags As Integer
Public Time As Integer
Public ExtraInfo As UInt32
End Structure
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal hook As Integer, ByVal address As LowLevelHookDelegate, ByVal [mod] As Integer, ByVal threadId As Integer) As Integer
Private Declare Function CallNextHookEx Lib "user32" (ByVal handle As Integer, ByVal code As Integer, ByVal wParam As Integer, ByVal lParam As KeyboardLowLevelHookStruct) As Integer
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal handle As Integer) As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal virtualKey As Integer) As Integer
Private m_hookHandle As Integer
Private Function LowLevelHook(ByVal code As Integer, ByVal wParam As Integer, ByRef lParam As KeyboardLowLevelHookStruct) As Integer
If code = Hc_Action Then
If (wParam = WindowsMessage.KeyDown) OrElse _
(wParam = WindowsMessage.SystemKeyDown) OrElse _
(wParam = WindowsMessage.KeyUp) OrElse _
(wParam = WindowsMessage.SystemKeyUp) Then
'Dim alt As Boolean = (GetAsyncKeyState(Vk.Alt) And &H8000) = &H8000
'Dim shift As Boolean = (GetAsyncKeyState(Vk.Shift) And &H8000) = &H8000
Dim control As Boolean = (GetAsyncKeyState(Vk.Control) And &H8000) = &H8000
Dim suppress As Boolean
' CTRL+ESC
If control AndAlso lParam.VirtualKeyCode = Vk.Escape Then
suppress = True
End If
' ALT+TAB
'If (lParam.Flags And LowLevelKeyboardHfAltDown) = LowLevelKeyboardHfAltDown AndAlso lParam.VirtualKeyCode = Vk.Tab Then
' suppress = True
'End If
' ALT+ESC
If (lParam.Flags And LowLevelKeyboardHfAltDown) = LowLevelKeyboardHfAltDown AndAlso lParam.VirtualKeyCode = Vk.Escape Then
suppress = True
End If
' Left Windows button.
If lParam.VirtualKeyCode = Vk.LeftWindows Then
suppress = True
End If
' Right Windows button.
If lParam.VirtualKeyCode = Vk.RightWindows Then
suppress = True
End If
' Applications button.
If lParam.VirtualKeyCode = Vk.Applications Then
suppress = True
End If
If suppress Then
Return 1
End If
End If
Return CallNextHookEx(m_hookHandle, code, wParam, lParam)
End If
End Function
Public Sub Disable()
If m_hookHandle = 0 Then
m_hookHandle = SetWindowsHookEx(WindowsHookKeyboardLowLevel, AddressOf LowLevelHook, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
End If
End Sub
Public Sub Enable()
If m_hookHandle <> 0 Then
UnhookWindowsHookEx(m_hookHandle)
m_hookHandle = 0
End If
End Sub
End Class
答案 0 :(得分:0)
如果您只想将其称为“全局”,则可以这样做:
class SomeMainClassThatAlwaysIsUsed
{
static SomeMainClassThatAlwaysIsUsed () {
new Kiosk.Kiosk().Disable();
}
}
它使用静态初始化程序,每个AppDomain将运行一次。
答案 1 :(得分:0)
是“.dll”甚至引用了吗?