2011-10-27 11 views
1

次のコードを使用して、特定の時刻にキーボードの状態にアクセスします。C#キーボードクラスを使用するDLL関数を書くにはどうすればいいですか

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
using System.Windows.Input; 

namespace some.any 
{ 

    public class ANY_CLASS 
    { 
    [STAThread] //seems to do nothing here 
    public static short ThisIsCalledByAnExternalProgram() 
    { 
     try 
     { 
      if (Keyboard.IsKeyDown(Key.LeftAlt)) 
      { 
       return 1; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
     catch (Exception e) 
     { 
       MessageBox.Show(e.ToString()); 
       return 2; 
     } 
    } 
} 

このコードはコンパイルするいくつかのDLLが必要です。WindowsBase.dllとPresentationCore.dll

キーボードは通常、私はmain関数に[STAThread]属性を記述し、それがうまくいく、STAスレッドを必要とし、このコードはdllとして使用されるので、私はそれを行うことはできません。私の関数ThisIsCalledByAnExternalProgram()はSTAとして実行する必要がありますが、それはdoesntです。

このコードをDLLとして使用するにはどうすればよいですか?

EDIT: STAThreadフラグ付きメソッド内でThisIsCalledByAnExternalProgram()を呼び出すとどうなりますか?

私の外部プログラムで関数を呼び出すと、例外が発生します。 System.InvalidOperationException:...多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAでなければなりません。 スタックは、次のとおりです。

System.Windows.Input.InputManager..ctor() 
System.Windows.Input.InputManager.GetCurrentInputManagerImpl() 
ThisIsCalledByAnExternalProgram() 

EDIT#3: 私は質問を読み違える - ... STAThread以内にフラグを立て...私は現在、これを試してみてくださいすることはできません。それが渡して動作しているとします - 私は呼び出し側のプログラムを制御できないので、これはまだ問題を解決しません。

EDIT#2: Win32フックを使用してください: 私は移植性のためにネット内にいたいです。すべてのグローバルフックの亜種は、最終的には仮想マシンの下のマシンに依存しています。私は用意されたC#のキーボードクラスを使いたいと思っています。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Input; 
//Requires WindowsBase.dll 
//Requires PresentationCore.dll 


namespace KeyBoardDemo 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
       if (Keyboard.IsKeyDown(Key.LeftAlt)) 
       { 
        Console.WriteLine("LEFT ALT IS PRESSED"); 
       } 
       else 
       { 
        Console.WriteLine("LEFT ALT IS NOT PRESSED"); 
       } 
      } 
     } 
    } 
} 
+0

(投票「をクローズ複製」再;私は同意、それは直接関係ありません) –

+0

あなたはSTAThreadフラグを立てメソッド内ThisIsCalledByAnExternalProgramを()何を呼び出す発生したとき? –

+0

http://stackoverflow.com/questions/7196883/capture-media-keys-when-application-is-minimized/7730869#7730869 –

答えて

0

私は私の問題への解決策を見つけたが、それは回避策のように感じています。

)私は新しいスレッドを作成できるように静的なプロパティを回避する必要があります。 B)Keayboardを使用する前にSTAを確実にする必要があります。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 
using System.Windows.Input; 
using System.Threading; 

namespace some.any 
{ 

    public class ANY_CLASS 
    { 
    static STAKeyBoard mSTAKeyBoard = new STAKeyBoard(); 

    public static short ThisIsCalledByAnExternalProgram() 
    { 
     try 
     { 
      if (mSTAKeyBoard.IsKeyDown(Key.LeftAlt)) 
      { 
       return 1; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
     catch (Exception e) 
     { 
       MessageBox.Show(e.ToString()); 
       return 2; 
     } 
    } 

    class STAKeyBoard 
    { 
     private Thread mKeyBoardReadThread = null; 
     private Boolean mKeyState = false; 
     private Key mKeyOfInterest; 
     private string running = "ONLY ONE REQUEST"; 

     public Boolean IsKeyDown(Key KeyOfInterest) 
     { 
      lock (running) 
      { 
       mKeyOfInterest = KeyOfInterest; 
       mKeyBoardReadThread = new Thread(new ThreadStart(GetKeyState)); 
       mKeyBoardReadThread.SetApartmentState(ApartmentState.STA); 
       mKeyBoardReadThread.Start(); 
       mKeyBoardReadThread.Join(1000); 
       mKeyBoardReadThread.Abort(); 
       mKeyBoardReadThread = null; 
       return mKeyState; 
      } 
     } 

     private void GetKeyState() 
     { 
      mKeyState = Keyboard.IsKeyDown(mKeyOfInterest); 
     } 
    } 
} 
+0

XNAには使いやすいキーボードクラスがあります。私の特別な文脈では、それは有用ではありませんが、あなたが本当に自由に選択できるなら、XNAを見てください。 – Johannes

0

だけではなく、入力のためのWinフォームクラスを使用しての、フックを使用することを検討してください: -

それは別のコンテキストで動作し、ここでは、短いデモです。この記事では、ちょうどC#を使ってそれを行う方法の素晴らしい説明です。あなたのニーズに合った入力ライブラリ(.dll)も提供します。記事のスコープは主にグローバルフックですが、アプリケーション固有のフックの使用についても説明しています。

http://www.codeproject.com/KB/cs/globalhook.aspx

+0

あなたは記事へのリンクを投稿しませんでした。 –

関連する問題