SendMessage() geht irgend wie nicht

BasicAvid

Member
Hallo,

da bin ich wieder. Dank CDW weiß ich jetzt wie ich an die Handles eines Childs kommen. Nur jetzt bräuchte ich das Handle des aktiven Childs. Über die WinAPI Funktion SendMessage() sollte das ganze ja gehen, aber irgend wie gehts doch nicht ;). Und ich weiß nicht an was es liegt.

Hier mal der Testcode:
Code:
class getWinTitle
    {
        public enum WindowsMessages
        {
            WM_ACTIVATE = 0x6,
            WM_ACTIVATEAPP = 0x1C,            
            WM_MDIACTIVATE = 0x222,
            WM_MDICASCADE = 0x227,
            WM_MDICREATE = 0x220,
            WM_MDIDESTROY = 0x221,
            WM_MDIGETACTIVE = 0x229,
            WM_MDIICONARRANGE = 0x228,
            WM_MDIMAXIMIZE = 0x225,
            WM_MDINEXT = 0x224,
            WM_MDIREFRESHMENU = 0x234,
            WM_MDIRESTORE = 0x223,
            WM_MDISETMENU = 0x230,
            WM_MDITILE = 0x226            
        }


        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [DllImport("user32.dll")]
        static extern IntPtr GetForegroundWindow();

        [DllImport("coredll.dll", SetLastError = true)]
        static extern Int32 GetLastError();

        [DllImport("user32.dll")]
        static extern IntPtr ChildWindowFromPointEx(IntPtr hWndParent, POINT Point, uint mode); 

        [DllImport("user32.dll", EntryPoint = "GetWindowText")]
        extern static IntPtr GetWindowText(IntPtr hwnd, StringBuilder s, int length);

        [DllImport("user32.dll")]
        static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        public struct POINT
        {
            public long x;
            public long y;
        }

        [STAThread]
        static void Main(string[] args)
        {
            getWinTitle cl = new getWinTitle();
            cl.timer();
            Console.In.Read();
        }

        //private const UInt32 WM_MDIGETACTIVE = 0x0229;
        //public static int WM_MDIGETACTIVE = 553;

        private int wParam = 0;

        public const int GMMP_USE_DISPLAY_POINTS = 1;
        uint mode = GMMP_USE_DISPLAY_POINTS;

        public void timer()
        {
            Timer t = new Timer(2000);
            t.Elapsed += new ElapsedEventHandler(tick);
            t.Start();
        }

        private void tick(object sender, ElapsedEventArgs e)
        {
            IntPtr appWF = GetForegroundWindow();           
                              
            StringBuilder sb = new StringBuilder(256);
            StringBuilder cw = new StringBuilder(256);
            GetWindowText(appWF, sb, sb.MaxCapacity);
            Console.Out.WriteLine("{0}", sb.ToString(0, sb.Length));
            try
            {                
                Console.Out.WriteLine("MDI Parent = {0}", appWF.ToString());
                IntPtr appChild = SendMessage(appWF, 0x0229, 0, 0);
                if (appChild.ToInt32() == 0)
                {
                    Console.Out.WriteLine("Child Window not found!");
                }
                GetWindowText(appChild, cw, cw.MaxCapacity);
                Console.Out.WriteLine("-- {0} - {1}", cw.ToString(0, cw.Length), appChild.ToString());
            }
            catch (MarshalDirectiveException)
            {
                Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
            }                        
            
        }

    }

Dieser Testcode macht nichts anderes als zu schauen welches Window gerade Aktiv ist, und anhand des Handles zu schauen welches das aktive MDI-Child ist. Nur geht das eben nicht.

Ich kann euch ja mal ganz kurz beschreiben, was ich vorhabe. Ich habe eine MDI Anwendung, und jetzt möchte ich, sobald ich ein Child aktiviere, einen Screenshot vom Child machen. Der Screenshot wird automatisch mit dem WindowTitle in einem Verzeichnis gespeichert.

Ich danke euch schonmal im voraus.
 
Oben