7

.NETアプリケーションが現在開いているすべてのウィンドウハンドルを取得し、これらのウィンドウを移動/サイズ変更することは可能ですか?

P / Invokeを使用すれば可能だと確信していますが、この機能用のマネージコードラッパーがあるかどうか疑問に思いました。

4

1 に答える 1

14

はい、Windows API を使用して可能です。

この投稿には、アクティブなプロセスからすべてのウィンドウ ハンドルを取得する方法に関する情報があります: http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=35545

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
       Process[] procs = Process.GetProcesses();
       IntPtr hWnd;
       foreach(Process proc in procs)
       {
          if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
          {
             Console.WriteLine("{0} : {1}", proc.ProcessName, hWnd);
          }
       }         
    }
 }

次に、Windows API を使用してウィンドウを移動できます: http://www.devasp.net/net/articles/display/689.html

[DllImport("User32.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint);

...

MoveWindow((IntPtr)handle, (trackBar1.Value*80), 20 , (trackBar1.Value*80)-800, 120, true);

MoveWindow 関数のパラメーターは次のとおりです。

ウィンドウを移動するには、MoveWindow 関数を使用します。この関数は、ウィンドウ ハンドル、上隅の座標、および画面座標に基づくウィンドウの希望の幅と高さを取得します。MoveWindow 関数は次のように定義されます。

MoveWindow(HWND hWnd, int nX, int nY, int nWidth, int nHeight, BOOL bRepaint);

bRepaint フラグは、クライアント領域を無効にするかどうかを決定し、WM_PAINT メッセージを送信して、クライアント領域を再描画できるようにします。余談ですが、画面の座標は GetClientRect(GetDesktopWindow(), &rcDesktop) と同様の呼び出しを使用して取得できます。rcDesktop は RECT 型の変数であり、参照によって渡されます。

( http://windows-programming.suite101.com/article.cfm/client_area_size_with_movewindow )

于 2008-09-26T18:05:51.790 に答える