2

プロセスの入力スレッドを特定する方法を知っている人はいますか?

シナリオは、GetKeyboardLayoutを呼び出して、別のアプリケーション (任意のプログラム) 内から入力スレッド ID を渡したいというものです。各スレッドは独自のキーボード入力言語セットを持つことができますが、別のプロセスに適切な入力スレッド ID を見つけることは、おそらく不可能なことのように思えます。

たとえば、メモ帳のプロセス ID を渡す関数を作成すると、この関数は内部で入力スレッド ID を判別し、GetKeyboardLayout から値を返します。この関数の呼び出し元は、メモ帳用に選択された入力言語を画面に表示します。

あなたの素晴らしい人々の中に何かアイデアはありますか?

4

2 に答える 2

2

Windows では、ユーザーと対話する特定のスレッドを持つプロセスは必要ありません。多くの場合、プロセスの起動スレッドである必要はありません。また、プログラムを 1 つのスレッドに限定するわけではありませんが、多くの場合、1 つのスレッドしか使用しません。

最初にウィンドウを見つけることから始める必要があります。FindWindow、FindWindowEx、または EnumWindows などの API 関数を使用します。それを取得したら、GetWindowThreadProcessId() を使用してウィンドウを所有しているスレッドを見つけることができます。ワーカー スレッドが作成する可能性のある非表示のヘルパー ウィンドウに注意してください。Spy++ は基本的なデバッグ ツールです。

于 2012-11-24T16:12:55.260 に答える
1

あなたはそれを試すかもしれません、それはすべてのトップレベルウィンドウを通り抜け、プロセスIDに属するものを検索します:

// complle and link with: cl layout.cxx user32.lib
#include <windows.h>
#include <stdio.h>
#include <assert.h>
DWORD desiredProcId;
BOOL CALLBACK enumCallBack(HWND hwnd, LPARAM lParam) {
  DWORD procId;
  DWORD winThread=GetWindowThreadProcessId(hwnd, &procId);
  if (procId==desiredProcId) {
    HKL hkl=GetKeyboardLayout(winThread);
    char buf[1000];
    GetWindowText (hwnd, buf, sizeof(buf));
    printf ("hwnd=%x name=%s, winThread=%x, HKL=%x\n", hwnd, buf, winThread, hkl);
    return false;
  }
  return true; 
}
int main (int argc, char *argv[]) {
  if (argc==1) {
    printf ("usage: %s processId (in decimal like from taskmanager)\n", argv[0]);
  }
  else {
    sscanf (argv[1], "%d", &desiredProcId);
    EnumWindows (enumCallBack, 0);
  }
}
于 2012-11-24T16:24:38.623 に答える