別の画面でプロセスを介してプログラムを開始/ランチする方法はありますか?
ここ と誰かが尋ねましたが、答えはありませんでした。
注:これは私のアプリのフォームではありません。別の画面で外部プログラムを実行することについて質問しています!
ウィンドウはあなたのものではないため、Windows APIを呼び出すことによってのみ移動できます。これを行う必要があります:
プロセスを起動します。
FindWindow
を使用して、ウィンドウのハンドルを取得します。ウィンドウがまだ存在しない場合、プロセスはまだウィンドウを作成していません。 500ミリ秒間スリープしてから、再試行してください。 (ただし、無限ループに陥らないでください。適切なタイムアウト後にウィンドウが見つからない場合は停止してください。)
SetWindowPos
を使用して、ウィンドウの位置を変更します。
ウィンドウのタイトルがわからない場合は、FindWindow
を使用できません。その場合、
プロセスを起動し、Process.Handle
を取得してプロセスハンドルを取得します。
EnumWindows
を使用して、すべてのウィンドウを取得します。ウィンドウごとに、 GetWindowThreadProcessId
を使用して、それがプロセスに属しているかどうかを確認します。プロセスに属するウィンドウがない場合は、しばらく待ってください。
SetWindowPos
を使用して、ウィンドウの位置を変更します。
もちろん、Screen.AllScreens[n].WorkingArea
を使用して必要な画面の位置とサイズを取得し、それに対してウィンドウを相対的に配置できます。
最初に、次のようなものを使用して2番目のモニターの領域を取得します。
Rectangle area = Screen.AllScreens[1].WorkingArea;
Windows API SetWindowPos を使用して移動します Process.MainWindowHandle を使用して、他のプロセスの開始から取得したハンドルとして使用します。
Timwiは非常に役立つヒントを提供していたので、これらの関数を使用してライブラリを呼び出すPowerShellスクリプトを作成し、使いやすくしてソリューションを共有することにしました。
私は起動時に複数のChrome=ウィンドウを実行する必要があり、GitHubのソリューションはこの問題を正確に対象としています(関連する質問: https://superuser.com/a/901790/111424) )。
ただし、基本的なロジックは同じです。
操作するWindowsハンドルを見つけます。 Timwiが言及しているように、一般的なケースではFindWindowまたはEnumWindowsを使用できます。ただし、プロセスがシンプルでメインウィンドウが1つしかない場合は、次のようになります。
var hndl = proc.MainWindowHandle
ハンドルがあれば、次の関数を使用できます。表示番号(1から開始)とハンドルを指定するだけです。
public static bool MoveToMonitor(IntPtr windowHandle, int monitor)
{
monitor = monitor - 1;
return WinApi.SetWindowPos(windowHandle, IntPtr.Zero, Screen.AllScreens[monitor].WorkingArea.Left,
Screen.AllScreens[monitor].WorkingArea.Top, 1000, 800, SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOREDRAW);
}
http://www.pinvoke.net/ にあるすべての列挙型と関数のインポート、またはGitHubにコードをコピーするだけです https://github.com/alex-tomin/ Tomin.Tools.KioskMode 。
プロセスを開始し、プロセスのメインウィンドウを取得し、SetWindowPos()などのAPI呼び出しを使用して、ウィンドウを目的の画面に移動する必要があります。
ウィンドウを最大化せず、ウィンドウを閉じるときに最大化しない場合、次にアプリを開いたときに、前回のモニターに表示されます。
アプリ/ウィンドウを閉じたときに最大化されていて、次にもう一度開いた場合は、代わりにプライマリモニターに表示されます。
このコードをform_load
方法:
this.setdesktoplocation(int x, int y);
this.windowstate = formwindowstate.maximized;
Xの値は、メイン画面の幅より大きくなければなりません。たとえば、メイン画面の解像度が1366 x 786ピクセルの場合、xには少なくとも1368以上の値を指定する必要があります。
それは私のために働いた。しかし、それはデバッグ目的のためだけです。結局のところ、アプリが終了したらメインモニターで実行する必要があります。