2017-06-01 13 views
0

私は現在Arduinoに基づいてプログラム可能なキーボードで作業しています。 C#プログラムは、USBを介してキーが押された情報を取得します。これまでは、ショートカットを使ってプログラムを開くことができました。C#アクティブなプログラムID

さらに、私はさまざまなプログラムに異なるキーバインディングを設定したいと考えています。 これを動作させるには、exeファイルの名前のような、アクティブなプログラムから特定の詳細を取得する必要があります。

検索中に、GetActiveWindow機能でアクティブなウィンドウを取得できることがわかりました。別のWindows機能を使用する必要があることがわかりましたが、どちらが見つからないのですか。

ウィンドウのヘッダーテキストを取得できましたが、このテキストは開いているWordドキュメントごとに異なるため、これを使用できませんでした。

string activeProgram; 
... 
if(activeProgram=="Word"){...} 
else if(activeProgram=="Chrome"){...} 

答えて

1

あなたがGetActiveWindowを使用しているので、あなたはウィンドウハンドル(HWND)を持つ:

誰もが、私はこのように、if文と比較する特定の何かを得るために、使用できる機能の手掛かりを持っています。

GetWindowThreadProcessIdを呼び出して、プロセスIDを取得できます。

これはP /呼び出しの宣言です:あなたがプロセスIDを持っていたら

[DllImport("user32.dll", SetLastError=true)] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); 

は、あなたが実行可能ファイルを見つける必要があります。

Windows APIの使用を継続する場合は、GetModuleFileNameExGetProcessImageFileNameまたはQueryFullProcessImageNameでこれを行うことができます。プロセスハンドル(hProcess)を取得するには、OpenProcessを使用する必要があります。

ただし、必要はありません。あなたがプロセスIDを持っていたら、Processを使用して、実行可能ファイルを取得することができます。

var process = Process.GetProcessById((int)processId); 
var fileName = process.MainModule.FileName; 

注:セキュリティ制限が適用されます。あなたのプログラムは、他のプロセスを読み込み、ファイル名を取得するために必要な権限を持っている必要があります。


これで、アクティブウィンドウを作成したプロセスのメイン実行可能ファイルを取得できます。悪意のあるユーザーが実行ファイルの名前を変更してプログラムを騙すとどうなりますか? - ボーナスチャッター:how to check if a file has a digital signature

+0

コードはこれまでのところ動作しており、私のファイルの完全なパスを取得しています(これは本当にうまくいっています。ありがとうございます)。問題は、別のウィンドウの名前を取得するときです。私は32ビットプロセスで64ビットプロセスにアクセスできないため、Win32例外が発生します。自分のファイルを64ビットプログラムにすることはできますか?それとも別の方法がありますか? – Schiep

+0

@Schiepまず、IntPtrとintの間にキャストしていないことを確認します。 IntPtrを返すように['GetActiveWindow'(http://www.pinvoke.net/default.aspx/user32.getactivewindow)を宣言する必要があります。第2に、32ビットと64ビットのコンパイルターゲットを設定する必要があるかもしれません(ビルド - >設定マネージャの下にあります)。 msdnの[64ビットアプリケーション](https://msdn.microsoft.com/en-us/library/ms241064.aspx)を参照してください。 「既存の.NET(C#)アプリケーションを64ビットに移植する際の考慮事項」(https://www.ibm.com/support/knowledgecenter/SSGSMK_7.1.1/development_sym/app_net_port_64bit.html)の記事は、Symphonyを無視するのに役立ちます。 – Theraot

関連する問題