2011-03-03 12 views
0

私はC#.NETで盲人向けのソフトウェアを開発しています。
ソフトウェアはキーボードと音声のみで動作します。
コンピュータが起動すると、プログラムは起動メニューに表示されますが、何らかの理由でプログラムがフォーカスがない状態でアクティブになるため、フォーカスが再転送されない限り正常に動作しません。フォームへのフォーカスの維持

ソフトウェアにフォーカスがない場合でもキーボードキーをフックする方法を見つけましたが、解決策として表示されません。

は、私は方法は、以下の一つ以上をやりたい:

  1. は、起動時にプログラムのロードを確認し、ピントが合っています。
  2. プログラムに焦点を当ててください(このコンピュータはこのプログラムのみを使用して実行されます)。
  3. プログラムにフォーカスを戻すために、キーボードショートカット、好ましくは1つのキーのみを検索します(Alt + )。

助けていただければ幸いです。

答えて

3

あなたが実行して、プログラムを集中するスタートアップコンソールアプリケーション上で実行することができ、このつまりを解決することができる多くの方法があります。

[STAThread] 
    static void Main(string[] args) 
    { 
     System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); 
     myProcess.StartInfo.FileName = "calc"; 
     myProcess.Start(); 
     IntPtr hWnd = myProcess.Handle; 
     SetFocus(new HandleRef(null, hWnd)); 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern IntPtr SetFocus(HandleRef hWnd); 

あなたのアプリがある場合は、Windowsサービスアプリケーションをホストし、タイマーチェックを使用することができます生きていると集中しているか、あなたはそれを戻すためにホットキーを使用することができますが重視:

http://www.codeproject.com/KB/miscctrl/ashsimplehotkeys.aspx

編集これは生きているあなたのアプリを維持し、(テスト)焦点を当てますコンソールアプリケーションです。私はWindowsサービスのためのウォークアラウンドは、何か変更され、サービスから見つかったときにフォームが見えないので、必要があります:P

static Process myProcess; 

    [STAThread] 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      //count how many procesess with this name are active if more than zero its still alive 
      Process[] proc = Process.GetProcessesByName("myprog"); 
      if (proc.Length > 0) 
      { 
       //its alive check if it has focus 
       if (proc[0].MainWindowHandle != GetForegroundWindow()) 
       { 
        SetFocus(proc[0].MainWindowHandle); 
       } 
      } 
      //no process start new one and focus on it 
      else 
      { 
       myProcess = new Process(); 
       myProcess.StartInfo.FileName = "C:\\aa\\myprog.exe"; 
       myProcess.Start(); 

       SetFocus(myProcess.Handle); 
      } 
      Thread.Sleep(1000); 
     } 
    } 

    private static void SetFocus(IntPtr handle) 
    { 
     SwitchToThisWindow(handle, true); 
    } 

    [DllImport("user32.dll")] 
    static extern IntPtr GetForegroundWindow(); 


    [DllImport("user32.dll", SetLastError = true)] 
    public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab); 

+0

ありがとうございました。コードを説明することができれば、私のプログラムをスタートアップに追加することと何が違うのでしょうか?また、Windowsサービスアプリケーションのサンプルを追加することが可能な場合。もう一度ありがとう – CaptainNemo

+1

あなたが書きました:コンピュータが起動すると、プログラムはスタートアップメニューに表示されますが、何らかの理由でプログラムがフォーカスしていない状態で起動しています。主な相違点は、SetFocusがあなたのアプリケーションに焦点を当てる方法です。単に "calc"を.exeファイルのパスに置き換えるだけです。 "C:\\ myprog.exe"。私はコードであなたを助けるかもしれませんが、私はどのバージョンのVS/.NET Frameworkを使用しているのか知っている必要がありますか? – Silx

+0

もう一度おねがいします。私はVS 2010と.NET 4を使用しています – CaptainNemo

関連する問題