2009-07-28 11 views
0

Ich erstellte Beispielprojekt, um die Tastenkombinationen von Windows zu deaktivieren. Dann habe ich die .exe dieses Beispielprojekts in die Referenz meines Hauptprojekts aufgenommen, wo ich diese Funktion implementieren möchte.Aufrufen einer EXE mit Bezug auf die C# Windows-Anwendung

Problem ist, es funktioniert nicht in meinem Hauptprojekt. Aber funktioniert perfekt in meinem Beispielprojekt.

Fehle ich etwas wie das Aufrufen der referenzierten .exe?

Ich möchte nicht den Code des Beispielprojekts zum Hauptprojekt implementieren ich möchte nur die .exe auf das Hauptprojekt verweisen.

WIE?

Danke.

Namespace BlockShortcuts

{

public class DisableKeys 

{ 

Private delegieren int LowLevelKeyboardProcDelegate (int nCode, int WParam, ref 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 statisch 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

Stellen Sie weitere Informationen über Klassen in Ihrer exe oder niemand kann Ihnen helfen Ich denke, –

Antwort

0

Aus einem Ihrer Kommentare bekomme ich die Idee, dass Sie nur versuchen, den Code zu instanziieren und Methoden darauf auszuführen. Haben Sie versucht:

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

    } 
} 

Haben Sie auch alle erforderlichen dlls in Sie Hauptprojekt auf nur einer enthalten?

+0

@Andrew Cox, ich kann das tun. Aber es läuft nicht meine Bewerbung durch. Beim Start funktioniert die .dll einwandfrei. Dann, nachdem Sie einige andere Sachen in der Anwendung gemacht haben, ist es der Zweck von .dll nicht funktioniert. Ich möchte versuchen, die .dll als global zu instantiieren. Vielleicht bin ich verwirrt. Korrigiere mich, wenn ich falsch liege. Vielen Dank. – Anuya

+0

@Andrew Cox, wie ich bereits sagte, die .dll wird die Tastaturkürzel deaktivieren. Also möchte ich, dass es global und shud sterben nur nach dem Beenden der .exe der Hauptanwendung. – Anuya

+0

@Karthik, können Sie Ihre Frage bearbeiten, um mehr Code hinzuzufügen, der den BlockShortcuts-Code verwendet? Ich habe Probleme zu verstehen, warum es funktionieren würde, wenn es am Anfang funktioniert. –

0

das Projekt Referenzierung erzählt nur von Visual Studio (oder was auch immer IDE Sie verwenden), die Sie vielleicht aus dieser Bibliothek einen Code verwenden, es wird nichts enthalten oder irgendetwas auszuführen auf es ist eigen. Wenn Sie Code aus dem Beispielprojekt ausführen möchten, können Sie es entweder als DLL erstellen (wenn Sie den Quellcode haben) oder Sie können das Programm von Ihrem Hauptprogramm ausführen (Sie müssen es nicht als Referenz in das Programm aufnehmen) Fall).

+0

@Rune FS, Danke für Ihre Unterstützung. Ich habe eine Bibliothek aus meinem Beispielprojekt erstellt und diese Bibliothek in mein Hauptprojekt aufgenommen. Nun ist das Problem, ich konnte die Referenz-DLL nicht instanziieren, weil die Funktion nicht im Quellcode der DLL statisch ist. Bitte schauen Sie sich den Code an und helfen Sie mir, die DisableKeyBoardHook() -Funktion in static zu ändern. So kann ich von meiner Hauptform des Hauptprojektes anrufen. Ich habe die Klassendatei hinzugefügt. Bitte checken sie aus. Vielen Dank. – Anuya

+0

@Rune FS, wenn ich die DisableKeyBoardHook() -Funktion auf statische ändern, habe ich einige Probleme. Verwirrt !!! – Anuya

+0

Von dem, was ich in Ihrem Code sehen kann, müssen Sie keine statische Methode haben, müssen Sie etwas wie tun: neue DisableKeys(). DisableKeyboardHook(); Hoffe, es hilft (ich rate irgendwie) –

0

Ich vermute, dass Ihr Code über einen statischen Konstruktor für eine Klasse initiiert wird. Der statische Konstruktor für die Klasse wird erst aufgerufen, wenn Sie auf die Klasse zugreifen (ein Objekt erstellen, auf ein statisches öffentliches Feld oder eine statische Eigenschaft zugreifen oder eine statische Methode aufrufen). Sie haben mehrere Optionen:

  1. Erstellen Sie ein Objekt, wenn Ihre Anwendung gestartet wird, wobei das Objekt für die Funktion verantwortlich ist. (Wie dieser Code in der Hauptklasse Ihrer Anwendung: private readonly KeyboardDisabler = new KeyboardDisabler();)
  2. Die anderen 2 Optionen (Attribute oder Reflexion) Ich weiß, sind schlecht. Tu sie nicht, also schreibe ich nicht mal über sie.

Auch, ich bin ziemlich sicher, dass die CLI wird nicht einmal eine referenzierte Assembly laden, wenn kein Code hinein ruft, so dass Ihre ursprüngliche Hoffnung liegt irgendwo zwischen „nicht möglich“ und „höchst unerwünscht“.