请教各位大神:
有另外一个程序正在运行,打开了一个窗体,标题栏是"aaa"
如何获得句柄,获得窗体中一个文体框的内容,并向窗体中的按键发送单击的消息?

解决方案 »

  1.   

    可以采用windows系统消息机制,sendmessage等,应该可以做到
      

  2.   

    http://blog.csdn.net/coolszy/article/details/5523700lz试试
      

  3.   


    我也是用这个方法,但FindWindowEx就是提示找不到子窗口
      

  4.   

    参照论坛大神的代码,编写了一个类,自己解决
    用了EnumWindows和EnumChildWindows,请问为什么FindWindows和FindWindowsEx实现不了using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    namespace 发送消息
    {
        class FindWindows
        {
            //API函数调用
            [DllImport("user32.dll")]
            public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);        [DllImport("user32.dll")]
            public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam);        [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount);        [DllImport("user32.dll")]
            public static extern bool IsWindowVisible(IntPtr hWnd);        [DllImport("user32.dll")]
            public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            public struct STRINGBUFFER
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
                public string szText;
            }
           
            //成员变量,构造函数,属性
            private IntPtr m_MainhWnd;
            private IntPtr m_ControlhWnd;
            private string m_ParentCaptin;
            private string m_ControlText;        public FindWindows(string parentcaption)
            {
                m_ParentCaptin = parentcaption;
            }        public IntPtr MainhWnd
            {
                get
                {
                    return m_MainhWnd;
                }
            }        //代理声明
            public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
            //获取主窗体的句柄
            public IntPtr GetMainFramHandle()
            {            EnumWindowsProc EunmWindows = new EnumWindowsProc(EnumWindowsFun);
                EnumWindows(EunmWindows, 0);
            
                if (m_MainhWnd != IntPtr.Zero)
                    return m_MainhWnd;
                else
                    return IntPtr.Zero;
            }
            //回调函数,枚举所有的主窗体,直至返回false
            private bool EnumWindowsFun(IntPtr p_Handle, int p_Param)
            {
                if (!IsWindowVisible(p_Handle)) return true;
                STRINGBUFFER _TitleString = new STRINGBUFFER();
                GetWindowText(p_Handle, out _TitleString, 256);    
                if (_TitleString.szText == m_ParentCaptin)
                {
                    m_MainhWnd = p_Handle;
                    return false;
                } 
                return true;
            }        /// <summary>
            /// 获取控件的句柄
            /// </summary>
            /// <param name="MainHandle">控件所在主窗口的句柄</param>
            /// <param name="ControlText">控件上的文本</param>
            /// <returns></returns>
            /// 
            public IntPtr GetControlHandle(IntPtr MainHandle,string ControlText)
            {
                m_ControlText = ControlText;
                EnumWindowsProc EunmControl = new EnumWindowsProc(EnumControlFun);
                EnumChildWindows(MainHandle, EunmControl, 0);
                if (m_ControlhWnd != IntPtr.Zero)
                    return m_ControlhWnd;
                else
                    return IntPtr.Zero;
            }
            private bool EnumControlFun(IntPtr p_Handle, int p_Param)
            {
                STRINGBUFFER _TextString = new STRINGBUFFER();
                GetWindowText(p_Handle, out _TextString, 256);            if (_TextString.szText == m_ControlText)
                {
                    m_ControlhWnd = p_Handle;
                    return false;
                }
                return true;
            }    }
    }
    //调用        private void button1_Click(object sender, EventArgs e)
            {
                 FindWindows fw = new FindWindows("Form2");
                 IntPtr MainhWnd = fw.GetMainFramHandle();
                IntPtr BtnhWnd = fw.GetControlHandle(MainhWnd, "button1");
           }