2009-08-26 20 views
0

私のアプリケーションでは、いくつかのキーボードキーを無効にするために再利用可能なKioskという.dllを使用しています。私はこのようにしています...C#アプリケーションで.dllからグローバルにメソッドを呼び出す

using Kiosk; 
----- 

public static Kiosk.Kiosk KIOSK = new Kiosk.Kiosk(); 

----- 

static void Main() 
{ 
    KIOSK.Disable(); 
} 

私はProgram.csと私のフォームの他のすべてのページ読み込みでこれを呼びます。私はこの関数をグローバルに一度だけ呼びたいと思います。私のアプリケーションからキーボードのキーを無効にするためにそれを呼び出す場所。

私はProgram.csがメソッドをグローバルに呼び出す正しい場所だと思いました。しかし、もし私がそこでメソッドを呼び出すならば、dosentが動作します。

助けてください。ありがとう。

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

ASP.NETアプリケーションWinフォームを作成していますか? WPF?キオスククラスはどのように見えますか? Disable()は静的に設定されていますか? – jscharf

+0

もっとコードを投稿すると、回答が得られるかもしれません。私はあなたがWinFormsまたはWPFアプリについて話していると思いますか? – JohannesH

答えて

0

あなただけの「グローバル」、一度それを呼び出したい場合、あなたはそのようにそれを行うことができます。

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

のAppDomainごとに、一度実行される静的初期化子を使用しています。

+0

彼は 'Main'からそれを呼び出すなら、まだ動作するはずです。何が間違っているのだろうか? –

+0

私はあまりにも不思議です。私は彼が、彼は常にMain()と呼んでいるとは思わないと思う。うまくいけば私達はより多くの情報を得る。 –

0

は ".dll"でも参照されますか?