2009-07-28 46 views
0

我創建了示例項目以禁用Windows的鍵盤快捷鍵。 然後我將這個示例項目的.exe包含到我想要實現此功能的主項目 的引用中。調用引用到C#窗口應用程序的.exe

問題是,它不在我的主要項目中工作。但在我的示例項目中完美工作 。

我是否缺少類似於調用引用.exe的內容?

我不想實施示例項目的代碼到主項目 我只想引用.exe到主項目。

如何?

謝謝。

命名空間BlockShortcuts

{

public class DisableKeys 

{ 

私人委託INT LowLevelKeyboardProcDelegate(INT NCODE,整數的wParam,參考KBDLLHOOKSTRUCT LPARAM);

[DllImport("user32.dll", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi)] 

    private static extern int SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId); 

    [DllImport("user32.dll")] 

private static extern int UnhookWindowsHookEx(int hHook);

[DllImport("user32.dll", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi)] 

    private static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); 

    const int WH_KEYBOARD_LL = 13; 

    private int intLLKey; 

    private struct KBDLLHOOKSTRUCT 
    { 
     public int vkCode; 
     int scanCode; 
     public int flags; 
     int time; 
     int dwExtraInfo; 
    } 
    private int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam) 
    { 
     bool blnEat = false; switch (wParam) 
     { 
      case 256: 
      case 257: 
      case 260: 
      case 261: 
       //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key       
       if (((lParam.vkCode == 9) && (lParam.flags == 32)) || 
        ((lParam.vkCode == 27) && (lParam.flags == 32)) || 
        ((lParam.vkCode == 27) && (lParam.flags == 0)) || 
        ((lParam.vkCode == 91) && (lParam.flags == 1)) || 
        ((lParam.vkCode == 92) && (lParam.flags == 1)) || 
        ((true) && (lParam.flags == 32))) 
       { 
        blnEat = true; 
       } 
       break; 
     } if (blnEat) return 1; else return CallNextHookEx(0, nCode, wParam, ref lParam); 
    } 
    public void DisableKeyboardHook() 
    { 
     intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, new LowLevelKeyboardProcDelegate(LowLevelKeyboardProc), System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0); 
    } 
    private void ReleaseKeyboardHook() 
    { 
     intLLKey = UnhookWindowsHookEx(intLLKey); 
    } 
    #endregion 
} 

}

+0

提供有關您的exe中的課程的更多信息或沒有人可以幫助您我認爲 – 2009-07-28 04:30:54

回答

0

從您的一條評論中我得到的想法是,您只是試圖實例化代碼並在其上運行方法。您是否嘗試過:

namespace test 
{ 
    using BlockShortcuts; 
    class MyTest 
    { 
     public static void Main(string[] args) 
     { 
      DisableKeys dk = new DisableKeys(); 
      dk.DisableKeyboardHook(); 
     } 

    } 
} 

也有你包括了所有必需的DLL插入一個你主項目?

0

引用該項目只是告訴你可能需要使用一些代碼從庫Visual Studio(或什麼都IDE你正在使用),也不會包含任何或執行任何它自己的。如果你想從示例項目中執行代碼,你可以將它構建爲一個dll(如果你有源代碼),或者你可以從你的主程序執行程序(你不需要在後者中包含它作爲參考)案件)。

+0

@Rune FS,感謝您的支持。我從我的示例項目中創建了庫,並將該庫包含在我的主項目中。 現在的問題是我無法實例化引用dll,因爲該函數在dll的源代碼中不是靜態的。 請查看代碼並幫助我將DisableKeyBoardHook()函數更改爲static。所以我可以從我的主要項目的主要形式打電話。 我已添加類文件。請檢查。謝謝。 – Anuya 2009-07-28 05:48:29

+0

@Rune FS,如果我將DisableKeyBoardHook()函數更改爲靜態,我正面臨一些問題。困惑! – Anuya 2009-07-28 05:52:18

0

我猜你的代碼是通過一個類的靜態構造函數啓動的。除非您對類進行某些訪問(創建對象,訪問公共靜態字段或屬性或調用靜態方法),否則不會調用該類的靜態構造函數。您有幾個選項:

  1. 創建一個對象,當您的應用程序啓動時,對象負責該功能。 (比如你的應用程序主類中的這個代碼:private readonly KeyboardDisabler = new KeyboardDisabler();
  2. 我知道的其他2個選項(屬性或反射)是不好的。不要這樣做,所以我甚至沒有寫關於它們的文章。

另外,我非常確定,如果沒有代碼調用它,CLI甚至不會加載引用的程序集,因此您最初的希望落在「不可能」和「非常不可取」之間。