Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using SetWindowPos in C# to move windows around

I have the code below:

namespace WindowMover {     using System.Windows.Forms;      static class Logic     {         [DllImport("user32.dll", EntryPoint = "SetWindowPos")]         public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);          public static void Move()         {             const short SWP_NOMOVE = 0X2;             const short SWP_NOSIZE = 1;             const short SWP_NOZORDER = 0X4;             const int SWP_SHOWWINDOW = 0x0040;              Process[] processes = Process.GetProcesses(".");             foreach (var process in processes)             {                 var handle = process.MainWindowHandle;                 var form = Control.FromHandle(handle);                  if (form == null) continue;                  SetWindowPos(handle, 0, 0, 0, form.Bounds.Width, form.Bounds.Height, SWP_NOZORDER | SWP_SHOWWINDOW);             }         }     } } 

This is supposed to move every window on my desktop to 0,0 (x,y) and keep the same sizes. My problem is that only the calling app (built in C#) is getting moved.

Should I be using something else other than Control.FromHandle(IntPtr)? Will this only find dotnet controls? If so what should I use?

Also, the second 0 in SetWindowPos was just a random int I stick in there, I'm not sure what to use for int hWndInsertAfter

What about processes with multiple windows like pidgin?

like image 393
Matt Avatar asked Jul 27 '09 20:07

Matt


People also ask

How do you Z order a window?

You can use the GetTopWindow function to search all child windows of a parent window and return a handle to the child window that is highest in z-order. The GetNextWindow function retrieves a handle to the next or previous window in z-order.

What is Hwnd?

A Windows window is identified by a "window handle" ( HWND ) and is created after the CWnd object is created by a call to the Create member function of class CWnd . The window may be destroyed either by a program call or by a user's action. The window handle is stored in the window object's m_hWnd member variable.

What is SetWindowLong?

The SetWindowLong function creates the window subclass by changing the window procedure associated with a particular window class, causing the system to call the new window procedure instead of the previous one.


1 Answers

Just take out your Control.FromHandle and the form == null check. You should be able to just do:

IntPtr handle = process.MainWindowHandle; if (handle != IntPtr.Zero) {     SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW); } 

If you add SWP_NOSIZE, it will not resize the window, but will still reposition it.

If you want to effect all windows, not just the main window, of each process, you might want to consider using P/Invoke with EnumWindows instead of iterating through the Process list and using MainWindowHandle.

like image 152
Reed Copsey Avatar answered Sep 19 '22 07:09

Reed Copsey