Avatar billede the-gnu.dk Nybegynder
07. februar 2007 - 17:49 Der er 3 kommentarer og
1 løsning

Flytte/Resize Eksternt vindue

Jeg starter en Power Point Viewer, som går i gang. Jeg kunne godt tænke mig at resize vinduet, men ligemeget hvad jeg gør, har det ingen effekt.

Jeg prøver:

        Timer t;
        Process p;

        public PowerPointViewer(string filename) {
            InitializeComponent();

            p = Process.Start(@"C:\Programmer\Microsoft Office\PowerPoint Viewer\PPTVIEW.EXE", "\""+filename+"\"");
            p.EnableRaisingEvents = true;
            p.Exited += new EventHandler(p_Exited);

            while(p.Handle == IntPtr.Zero)
                System.Threading.Thread.Sleep(20);

            t = new Timer();
            t.Interval = 6000;
            t.Tick += new EventHandler(t_Tick);
            t.Start();
        }

        void t_Tick(object sender, EventArgs e) {
            SetWindowPos(p.Handle.ToInt32(), 0, 0, 0, 300, 300, 0);
            MoveWindow(p.Handle,0, 0, 400, 400, true);
            Console.WriteLine("Færdig!");
        }

        void p_Exited(object sender, EventArgs e) {
        }

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

        [DllImport("user32.dll", EntryPoint="DrawMenuBar")]
        static extern Int32 DrawMenuBar(Int32 hWnd);

        [DllImport("user32.dll")]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

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

        [DllImport("user32.dll")]
        static extern bool CloseWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        static extern bool DestroyWindow(IntPtr hWnd);
Avatar billede bulgroz Nybegynder
07. februar 2007 - 23:23 #1
Du får brugt det gale handle!

Du skal have fat i System.IntPtr mainWindowHandle = this.process.MainWindowHandle;

Jeg har strikket et lille eksempel som viser hvorledes du kan gøre. Så kan du selv lægge din timer på bagefter...

Eksemplet flytter blot notepad når du trykker en knap (Jeg havde ikke PowerPoint Viewer liggende :-)

public partial class Form1 : Form
    {
        Process process;

        public Form1()
        {
            this.InitializeComponent();

            this.process = Process.Start(@"C:\WINDOWS\NOTEPAD.EXE", @"C:\Test.txt");
        }

        private void ButtonMoveClick(object sender, EventArgs e)
        {
            try
            {
                System.IntPtr mainWindowHandle = this.process.MainWindowHandle;

                MoveWindow(mainWindowHandle, 20, 20, 400, 400, true);
            }
            catch(InvalidOperationException)
            {
                MessageBox.Show("Oops");
            }
        }

        /// <summary>
        /// The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area.
        /// </summary>
        /// <param name="hWnd">Handle to the window.</param>
        /// <param name="X">Specifies the new position of the left side of the window.</param>
        /// <param name="Y">Specifies the new position of the top of the window.</param>
        /// <param name="nWidth">Specifies the new width of the window.</param>
        /// <param name="nHeight">Specifies the new height of the window.</param>
        /// <param name="bRepaint">
        /// Specifies whether the window is to be repainted.
        /// If this parameter is TRUE, the window receives a message.
        /// If the parameter is FALSE, no repainting of any kind occurs.
        /// This applies to the client area, the nonclient area (including the title bar and scroll bars),
        /// and any part of the parent window uncovered as a result of moving a child window.
        /// </param>
        /// <returns>
        /// If the function succeeds, the return value is nonzero.
        /// If the function fails, the return value is zero.
        /// To get extended error information, call GetLastError.
        /// </returns>
        /// <remarks>
        /// If the bRepaint parameter is TRUE, the system sends the WM_PAINT message to the window procedure immediately after moving the window (that is,
        /// the MoveWindow function calls the UpdateWindow function). If bRepaint is FALSE, the application must explicitly invalidate or redraw any parts
        /// of the window and parent window that need redrawing. MoveWindow sends the WM_WINDOWPOSCHANGING,
        /// WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.
        /// </remarks>
        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
    }
Avatar billede the-gnu.dk Nybegynder
08. februar 2007 - 10:04 #2
Ja, det kan jeg da egentlig godt se. Det er lidt pudsigt - hvis man spørger på MainWindowHandle én gang, hvor den er 0 (vinduet ikke sat), og anden gang man spørger, er den stadig 0 - også selvom den er sat.

Derimod laver man en Thread.Sleep(4000); hvorefter man kalder MainWindowHandle, kører det hele som det skal.
Avatar billede the-gnu.dk Nybegynder
08. februar 2007 - 10:04 #3
Prøv at lave et svar, så får du points
Avatar billede bulgroz Nybegynder
08. februar 2007 - 10:23 #4
Der er også mange andre muligheder du kan lege med. Prøv f.eks. AnimateWindow. Når du har fået ovenstående til at funke, er det lige til højrebenet med de andre window kommandoer fra user32.dll.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester