views:

43

answers:

1

My WinForms app uses Process.Start() to open files in their native app. I want to split the screen in half, showing my WinForms app on one half and the new process on the other. I know I can use Process.MainWindowHandle to get the window handle, but how can I set its size and position?

I imagine I have have to use some kind of Windows API, but which one and how? Since this is not really "in my wheelhouse", I am unsure of whether (and how) I need to use different APIs on 64bit Windows.

+2  A: 

The Windows API method in question is SetWindowPos. You can declare it like so:

[DllImport("user32.dll")]
private extern static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);

and read about it here: http://msdn.microsoft.com/en-us/library/ms633545.aspx

Added

Process.MainWindowHandle is the hWnd parameter you will use. hWndInsertAfter will probably be your own Form's handle (Form.Handle). You can use the Screen type to access information about the desktop: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.aspx

Added Thomas' comment

Make sure you WaitForInputIdle before calling SetWindowPos.

Process process = Process.Start(...);
if (process.WaitForInputIdle(15000))
    SetWindowPos(process.MainWindowHandle, this.Handle, ...);

The declaration for SetWindowPos above works for both 32- and 64-bit Windows.

Tergiver
You might want to call WaitForInputIdle on the process before you try to resize the window...
Thomas Levesque
Thomas, that is exactly what I needed!
flipdoubt
@Tergiver, you might want to add Thomas' bit about `Process.WaitForInputIdle`. If you do, I will mark this as the answer.Also, this is part of the Win32 API. Does it work on a 64bit OS?
flipdoubt
@flipdoubt: Done
Tergiver
@flipdoubt: Win32 is just the colloquial name for the API; all it's facilities work on 64 bit as well. The official name is the "Windows API".
Billy ONeal