1

画面キーボードのように機能するアプリケーションがあります。どこかでキーボードカーソル(キャレット)がアクティブになっているかどうかを知る必要があるため、キーボードはアクティブに設定されます。

キーボードフックとwinapiを検索しましたが、使用する適切な方法が見つかりませんでした。

問題を単純化するために、ユーザーが実際のキーボードを押してコンピューターにテキストを印刷できる場合は、アプリケーションをアクティブにする必要があります。

4

4 に答える 4

2

カレットの位置は0より大きいはずなので、検索するだけで簡単です。

    GUITHREADINFO lpgui = new GUITHREADINFO();
    IntPtr fore = GetForegroundWindow();
    uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero);
    lpgui.cbSize = Marshal.SizeOf(lpgui.GetType());
    bool flag = GetGUIThreadInfo(tpid, out lpgui);
    WINDOWINFO pwi = new WINDOWINFO();
    pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType());
    GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi);

    if (flag)
    {
        if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0))
        {


            //TODO

        }
    }
于 2012-11-19T05:54:18.567 に答える
0

カスタムオンスクリーンキーボードの作成に関するMSDNの記事は次のとおりです。http://msdn.microsoft.com/en-us/magazine/hh708756.aspx

于 2012-10-08T12:30:16.343 に答える
0

少し回避策がありますが、環境でOnFocusChangeイベントをサブスクライブできる場合は、新しくフォーカスを受け取ったコントロールのタイプを確認できます。それが「キーボード可能」タイプであるか(または「キーボード可能」タイプから派生しているか)に応じて、オンスクリーンキーボードを表示または非表示にすることができます。

于 2012-10-08T12:21:34.210 に答える
0

DLLImport現在フォーカスされているウィンドウハンドルを取得できるように、を定義します。

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

これで、キーボードに焦点を合わせたものがある場合に、これを実行してそのウィンドウハンドルを取得できます。

public static bool ControlIsFocused() 
{
    // To get hold of the focused control: 
    IntPtr focusedHandle = GetFocus(); 
    return focusedHandle != IntPtr.Zero;
}

したがって、キーボードフォーカスを可能にするコントロールでない限り、このメソッドはを返す必要がありIntPtr.Zeroます。

これがWindowsAPIへのリンクです。

于 2012-10-08T12:36:08.303 に答える