3

Windows 7 タブレットで実行するアプリケーションがあり、スクリーン キーボードを画面の下部にドッキングする必要があります。理想的には、誰かがこれらの設定を移動または変更できないようにしたいと考えています。

こちらのスタック オーバーフローの回答に投稿されたコメントを使用してWindows Vista/7 でテキスト入力パネルをプログラムで制御する方法 (TabTip.exe) では、プログラムでキーボードを画面の下部にドッキングすることができるので、それがスタートです。それを機能させるには、昇格された許可で実行する必要がありました

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

string onScreenKeyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
var onScreenKeyboardProc = Process.Start(onScreenKeyboardPath);

IntPtr wKB = FindWindow("IPTip_Main_Window", null);

const uint WM_COMMAND = 0x111;
// Where message is 10021 for dock bottom, 10023 for dock top and 10020 for floating
bool x = PostMessage(wKB, WM_COMMAND, new IntPtr(10021), IntPtr.Zero);

それよりもサイズを少しうまく制御できるようにしたいので、次のようにウィンドウを移動しようとしました。

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

private const uint SWP_SHOWWINDOW = 0x0040;
bool ok = SetWindowPos(wKB, this.Handle, 0, 500, 750, 500, SWP_SHOWWINDOW);

ok は true を返しますが、ウィンドウは動きません。メモ帳でこれを試してみると、完全に機能します。それで、それはこの特定のプログラムの問題ですか?

4

1 に答える 1

2

問題は次の部分に分割できます

1) ウィンドウの移動を
防止する 2) ウィンドウのサイズ変更を
防止する 3) ウィンドウの最小化を防止する

1) 簡単に思えます:ウィンドウが動かないようにするにはどうすればよいですか?

2) と 3) は同じ手順で解決できます。

私は解決策についてさまざまなアイデアを持っています:
a) キーボードウィンドウがサイズ変更/最小化/移動されたかどうかを定期的にチェックするスレッドを作成し、(たとえば) SetWindowPos でその位置をリセットし
ます C# で別のアプリケーションのウィンドウ位置を取得および設定する方法
b )サイズ変更/最小化/移動イベント(WH_CBT =これらのイベントの前に発生)を「リッスン」して終了します。残念ながら、WH_CBT を通じてアナウンスされたイベントを強制的に無効にするかどうか、またその方法はわかりません。
別の解決策があるようです:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
ユーザー Pavel Shkleinik が書いたコメント セクションまでスクロールします。
EVENT_SYSTEM_MOVESIZ* と EVENT_SYSTEM_MINIMIZE* は、あなたのケースにとって興味深いようです。
前のイベントを検出して停止するか (方法を知っていれば)、これらのイベントの終了を検出してウィンドウの位置を強制的にリセットすることができます (SetWindowPos)。
Pinvoke Wiki と Google がフックの設定に役立ちます:
http://www.pinvoke.net/default.aspx/user32.setwineventhook

于 2014-01-09T09:53:21.113 に答える