画面キーボードのように機能するアプリケーションがあります。どこかでキーボードカーソル(キャレット)がアクティブになっているかどうかを知る必要があるため、キーボードはアクティブに設定されます。
キーボードフックとwinapiを検索しましたが、使用する適切な方法が見つかりませんでした。
問題を単純化するために、ユーザーが実際のキーボードを押してコンピューターにテキストを印刷できる場合は、アプリケーションをアクティブにする必要があります。
画面キーボードのように機能するアプリケーションがあります。どこかでキーボードカーソル(キャレット)がアクティブになっているかどうかを知る必要があるため、キーボードはアクティブに設定されます。
キーボードフックとwinapiを検索しましたが、使用する適切な方法が見つかりませんでした。
問題を単純化するために、ユーザーが実際のキーボードを押してコンピューターにテキストを印刷できる場合は、アプリケーションをアクティブにする必要があります。
カレットの位置は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
}
}
カスタムオンスクリーンキーボードの作成に関するMSDNの記事は次のとおりです。http://msdn.microsoft.com/en-us/magazine/hh708756.aspx
少し回避策がありますが、環境でOnFocusChangeイベントをサブスクライブできる場合は、新しくフォーカスを受け取ったコントロールのタイプを確認できます。それが「キーボード可能」タイプであるか(または「キーボード可能」タイプから派生しているか)に応じて、オンスクリーンキーボードを表示または非表示にすることができます。
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へのリンクです。