2012-01-22 4 views
0

こんにちは私は、特定のキーが押されたことに気づくプログラムをやっていて、その人が書いている場所に特定の文字を書いています。 しかし、私は問題を抱えています、それは私が "裸の人"としてプログラムを持つ必要がありたくないということです。代わりに、私はあなたが理解してほしいと、すべてに感謝しますが、ここでC#キーが押されたときの通知

は、コードのヘルプ

...ユーザーがキーを押していると、それはユーザーが書いているspesifick文字またはテキストを誘発し、書き出したいです私は、これまで取得:

 static void Main(string[] args) 
    { 

     while (true) 
     { 
      ConsoleKeyInfo cki; 
      cki = Console.ReadKey(); 
      Console.WriteLine(cki.Key.ToString()); 

      if (cki.Key.ToString() == "A" && (cki.Modifiers & ConsoleModifiers.Control) != 0) 
      { 
       System.Threading.Thread.Sleep(400); 
       TSendKeys.SendWait("ø"); 
      } 
     } 
    } 
+0

これはコンソールでのみ起こりたいことでしょうか? –

+0

すべてのキーボード入力をアプリで処理しますか? –

+0

"マークされた1"ではないので、このプログラムをバックグラウンドで実行し、キーロガーのような別のアクティブなアプリケーションでキーストロークをキャプチャしますか?以下のリンクが役に立つかどうかを確認してください:[Keylogger in VB.NET](http://revolt.hyperhub.info/blog.php?action=read&item=15) –

答えて

0

しかし、私は問題がある、それは私が「集約し1」など プログラムを持つことが必要であることを望んでいないということです。代わりに、私はあなたがについてWindows Hooksを話していると思うこれを読ん

...それはユーザー キーを押しているように、ユーザーが書いているspesifick文字またはテキストのうち をトリガし、書きたいん。 これは、ユーザーが別のアプリケーションに何かを印刷することを意味します(例: Word)が、そのキーをキャッチすることができます(アプリで押されていなくても)。これが実際に望むものなら、 this CodeProjectの記事が必要です。

0

一つのアプローチは、実際の読み取りで、個別に各文字を出力しながら、Console.ReadLineの動作をエミュレートすることで詳細にこれを行う方法について説明します。特別なシーケンス(CTRL + Aなど)を読むとき、その動作はインターセプトされ、文字が挿入されます。基本的な実装は以下の通りです。ドライブに

private static string EmulateReadLine() 
{ 
    StringBuilder sb = new StringBuilder(); 
    int pos = 0; 
    Action<int> SetPosition = (i) => 
     { 
      i = Math.Max(0, Math.Min(sb.Length, i)); 
      pos = i; 
      Console.CursorLeft = i; 
     }; 
    Action<char, int> SetLastCharacter = (c, offset) => 
     { 
      Console.CursorLeft = sb.Length + offset; 
      Console.Write(c); 
      Console.CursorLeft = pos; 
     }; 
    ConsoleKeyInfo key; 
    while ((key = Console.ReadKey(true)).Key != ConsoleKey.Enter) 
    { 
     int length = sb.Length; 
     if (key.Key == ConsoleKey.LeftArrow) 
     { 
      SetPosition(pos - 1); 
     } 
     else if (key.Key == ConsoleKey.RightArrow) 
     { 
      SetPosition(pos + 1); 
     } 
     else if (key.Key == ConsoleKey.Backspace) 
     { 
      if (pos == 0) continue; 
      sb.Remove(pos - 1, 1); 
      SetPosition(pos - 1); 
     } 
     else if (key.Key == ConsoleKey.Delete) 
     { 
      if (pos == sb.Length) continue; 
      sb.Remove(pos, 1); 
     } 
     else if (key.Key == ConsoleKey.Home) 
      SetPosition(0); 
     else if (key.Key == ConsoleKey.End) 
      SetPosition(int.MaxValue); 
     else if (key.Key == ConsoleKey.Escape) 
     { 
      SetPosition(0); 
      sb.Clear(); 
     } 
     // CUSTOM LOGIC FOR CTRL+A 
     else if (key.Key == ConsoleKey.A && 
      (key.Modifiers & ConsoleModifiers.Control) != 0) 
     { 
      string stringtoinsert = "^"; 
      sb.Insert(pos, stringtoinsert); 
      SetPosition(pos + stringtoinsert.Length); 
     } 
     else if (key.KeyChar != '\u0000') // keys that input text 
     { 
      sb.Insert(pos, key.KeyChar); 
      SetPosition(pos + 1); 
     } 

     // replace entire line with value of current input string 
     Console.CursorLeft = 0; 
     Console.Write(sb.ToString()); 
     Console.Write(new string(' ', Math.Max(0, length - sb.Length))); 
     Console.CursorLeft = pos; 
    } 

    Console.WriteLine(); 
    return sb.ToString(); 
} 

static void Main(string[] args) 
{ 
    string input = EmulateReadLine(); 
    Console.WriteLine("Entered {0}", input); 
} 

を行を入力する場合、CTRL + Aを押すと、 "^" 文字を挿入します。矢印キー、エスケープ、ホーム、およびエンドは、Console.ReadLineに対して通常どおり機能するはずです。 (コードを簡略化するために、カスタム挿入ロジックは固定配線されています)

関連する問題