Zmiana rozmiaru okna innej aplikacji

0

Witam mam mały problem ze zmianą okna programu który chcę uruchomić.

Mianowicie posiadam kod:

             OpenFileDialog file = new OpenFileDialog();
            DialogResult result = file.ShowDialog();
            String filename = "";
            if (result == DialogResult.OK)
                filename = file.FileName;

            Process p = Process.Start(filename);
            p.WaitForInputIdle();

            while (p.MainWindowHandle == IntPtr.Zero) { } //tu może być Thread.Sleep(500)
            MoveWindow(p.MainWindowHandle, 0, 0, 200, 200, true);

jednak jak uruchamiam np notatnik (wskazując dokłądną lokalizację pliku notepad.exe) to program uruchamia się prawidłowo z taką wielkością okna jak wpisałem w funkcji MoveWindow. Jednak jak np uruchomię program Geany to także uruchamia się z moimi parametrami wielkości ale jak tylko złapię za belkę u góry i chcę przenieść okno to zmienia ono automatycznie wielkość na większą. Jak zrobić aby każdy uruchomiony program (chciałbym uruchamiać programy z mojej aplikacji) miał taką wielkość okna jak wpisałem (oraz pozycję tego okna)?

Oczywiście MoveWindow jest z user32

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

Myślałem jeszcze czy nie lepiej będzie np hostować aplikacje ( http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project ) ktoś pomoże?

0

Ok to znalazłem coś takiego:

    public partial class Form1 : Form
    {
        [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", SetLastError = true)]
        static extern IntPtr SetParent(IntPtr child, IntPtr newParent);

        [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
        private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);

        [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
        private static extern bool PostMessage(IntPtr hwnd, uint Msg, int wParam, int lParam);

        private const int GWL_STYLE = (-16);
        private const int WS_VISIBLE = 0x10000000;
        private const int WM_CLOSE = 0x10;

        private IntPtr appWin = IntPtr.Zero;

        private String filename = @"C:\Windows\System32\notepad.exe";

        public Form1()
        {
            InitializeComponent();

            OpenFileDialog file = new OpenFileDialog();
            DialogResult result = file.ShowDialog();
            if (result == DialogResult.OK)
                filename = file.FileName;

            //AnotherWindow();
            WindowInWindow();
        }

        private void AnotherWindow()
        {
            Process p = Process.Start(filename);
            p.WaitForInputIdle();

            while (p.MainWindowHandle == IntPtr.Zero) { } //tu może być Thread.Sleep(500)
            MoveWindow(p.MainWindowHandle, 0, 0, 1000, 900, true);
        }

        private void WindowInWindow()
        {
            Process p = null;
            try
            {
                // Start the process 
                p = System.Diagnostics.Process.Start(filename);

                // Wait for process to be created and enter idle condition 
                p.WaitForInputIdle();

                while (p.MainWindowHandle == IntPtr.Zero) { }
                // Get the main handle
                appWin = p.MainWindowHandle;
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Error");
            }

            // Put it into this form
            SetParent(appWin, this.Handle);

            // Remove border and whatnot
            SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);

            // Move the window to overlay it on this window
            MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
        }

        protected override void OnResize(EventArgs e)
        {
            if (this.appWin != IntPtr.Zero)
            {
                MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
            }
            base.OnResize(e);
        }

        protected override void OnHandleDestroyed(EventArgs e)
        {
            // Stop the application
            if (appWin != IntPtr.Zero)
            {

                // Post a colse message
                PostMessage(appWin, WM_CLOSE, 0, 0);

                // Delay for it to get the message
                System.Threading.Thread.Sleep(1000);

                // Clear internal handle
                appWin = IntPtr.Zero;

            }

            base.OnHandleDestroyed(e);
        }
    }

I o ile notatnik i geany to mi się otwiera w moim oknie Windows Form o tyle np już word czy excel nie chce. Why? Jest w ogóle możliwość otworzenia każdego programu w moim oknie?

0

Funkcji AnotherWindow nie bierzcie pod uwagę. To jest praktycznie kod z mojego pierwszego posta, jednak znalazłem sobie uruchamianie programu w oknie windows form i pozamykałem to w oddzielnych funkcjach (windowInWindow oraz AnotherWindow) :) Chodzi mi oczywiście tym razem o funkcję WindowInWindow :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1