在c#应用程序中全局调用.dll中的方法

时间:2009-08-26 03:01:01

标签: c# vb.net

我在我的应用程序中使用一个名为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

2 个答案:

答案 0 :(得分:0)

如果您只想将其称为“全局”,则可以这样做:

class SomeMainClassThatAlwaysIsUsed
{
    static SomeMainClassThatAlwaysIsUsed () {
        new Kiosk.Kiosk().Disable();
    }
}

它使用静态初始化程序,每个AppDomain将运行一次。

答案 1 :(得分:0)

是“.dll”甚至引用了吗?