ShellExecuteEx() で osk.exe を起動した後、データ入力フィールドをカバーしないように、キーボード ウィンドウをデータ入力フィールドに対して相対的に配置したいと考えています。
呼び出す前にoskのウィンドウ位置を設定するにはどうすればよいですか?
また、終了時にアプリケーションでoskを非表示にするにはどうすればよいですか?
ShellExecuteEx() で osk.exe を起動した後、データ入力フィールドをカバーしないように、キーボード ウィンドウをデータ入力フィールドに対して相対的に配置したいと考えています。
呼び出す前にoskのウィンドウ位置を設定するにはどうすればよいですか?
また、終了時にアプリケーションでoskを非表示にするにはどうすればよいですか?
ウィンドウ クラス「OSKMainClass」を使用してFindWindowを使用してウィンドウ ハンドルを取得し、そのハンドルでSetWindowPosを使用して、ウィンドウを必要な座標に配置できます。(適切な座標に変換するには、コントロールのClientToScreenメソッドを使用する必要があるかもしれませんが、その部分は理解できるようにします。)
// Off the top of my head - not at a machine that has a Delphi compiler at
// the moment.
var
OSKWnd: HWnd;
begin
OSKWnd := FindWindow(PChar('OSKMainClass'), nil);
if OSKWnd <> 0 then
begin
SetWindowPos(OSKWnd,
HWND_BOTTOM,
NewPos.Left,
NewPos.Top,
NewPos.Width,
NewPos.Height,
0);
end;
end;
同じトピックに関連するCodeProject の記事から一部を抜粋したコード。AutoHotKey の Window Spy ユーティリティを使用してウィンドウ クラスを取得しました。
ノート:
Remy Lebeau は、を呼び出す前に渡すことができるプロセス ハンドルを取得するために、必ずCreateProcess()
orを使用する必要があることをコメントで指摘しています。そうしないと、OSK がウィンドウを作成する前にへの呼び出しが発生する可能性があります。ShellExecuteEx()
WaitForInputIdle()
FindWindow()
FindWindow()
mghie はコメントで、これを機能させる唯一の方法はアプリを管理者として実行することだと指摘しています。それ以外の場合、への呼び出しSetWindowPos()
は「アクセスが拒否されました (5)」という結果になりました。
上記のようにウィンドウを移動できません。Win32 コマンドを使用すると、スクリーン キーボードで SetWindow または MoveWindow が機能しませんでした。管理者権限でexeを実行しているときにのみ機能しました。
良い解決策ではないと思います。 別の解決策を見つけました。 これを通過してください。レジストリ値を使用しようとした後、うまく機能しましたが、アプリケーションのスクリーンキーボードで移動できます
試す
{
RegistryKey myKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Osk", true);
myKey.SetValue("WindowLeft", oskLeft, RegistryValueKind.DWord);
myKey.SetValue("WindowTop", oskTop, RegistryValueKind.DWord);
}
catch
{
//Log the error
}