1

私には、HWND としてSystem.Windows.Formの役割があります。IntPtr

それぞれに相手を動かしてもらいたい。「Hwnd get/set position c#」と多くのバリエーションを備えた Web 上で何も見つからなかったことに驚いています。おそらく、明らかな結果を見落としているのでしょう。

与えられた例のために、Form "window A" と Hwnd "window B" を考えてみましょう。また、B の位置を A の位置 + 右側に 50 ピクセルにしたいとします。

4

2 に答える 2

3

更新: WinFormsのNativeWindowクラスをチェックアウトすることもできます。このクラスを使用して、ネイティブをラップし、HWWNDそのウィンドウに送信されるウィンドウメッセージをリッスンできます。

MoveWindowウィンドウB(ウ​​ィンドウB)の位置(および寸法)を設定するには、Win32API関数が必要になると思いますHWND。このAPI関数は、.NETからP/Invokeを介して呼び出すことができます。

GetWindowRectウィンドウBの現在の位置とサイズを取得するには、さらにP/Invokeを介してを呼び出す必要がある場合があります。


次のコードはそのままでは機能しない可能性があり、より簡単な解決策があるかもしれませんが、上記のリンクとともに出発点を提供する可能性があります。

// the following P/Invoke signatures have been copied from pinvoke.net:

[DllImport("user32.dll", SetLastError = true)]
internal static extern bool MoveWindow(IntPtr hWnd, 
                                       int X, int Y,
                                       int nWidth, int nHeight, 
                                       bool bRepaint);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int Left;        // x position of upper-left corner
    public int Top;         // y position of upper-left corner
    public int Right;       // x position of lower-right corner
    public int Bottom;      // y position of lower-right corner
}

...

System.Windows.Form a = ...;
IntPtr b = ...;

RECT bRect;
GetWindowRect(b, out bRect);

MoveWindow(b,
           a.Location.X + 50, b.Location.Y,
           bRect.Right - bRect.Left, bRect.Bottom - bRect.Top,
           true);
于 2011-01-20T01:04:53.043 に答える
2

難しいのは、B が動いたときに A を動かすことです。これには、NativeWindow 派生クラスが必要です。AssignHandle を使用して、取得したウィンドウ ハンドルをアタッチします。WndProc() オーバーライドでは、WM_MOVE メッセージを検出できるため、A を移動できます。また、WM_DESTROY でクリーンアップできます。

ただし、ウィンドウがプロセスによって所有されている場合にのみ機能します。より典型的なシナリオは、これが別のプログラムで実行されている、制御できないコードに属するウィンドウであるということです。その場合、NativeWindow アプローチは機能しません。WH_CALLWNDPROC を監視できるように、SetWindowsHookEx() を使用してアンマネージ DLL をプロセスに挿入する必要があります。何らかの IPC メカニズムを使用して、その通知をプロセスに取り込みます。正しく理解するのは非常に難しく、C# で DLL コードを書くことはできません。

于 2011-01-20T01:47:57.623 に答える