WPF获取窗口句柄,并向窗口内控件无差别发送文本内容

using System.Windows.Interop;
using System.Runtime.InteropServices;   //DllImport

        /*通过这个方法,可以找到主进程的窗体*/
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  //获取窗口句柄

        [DllImport("USER32.DLL", EntryPoint = "FindWindowEx", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, int hwndChildAfter, string lpszClass, string lpszWindow);  //获取主窗口的子窗口句柄
        [DllImport("user32.dll")]
        public static extern int SetWindowText(int handle, string title);   //设置窗口标题
        [DllImport("user32.dll", EntryPoint = "GetWindowText")]
        public static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int cch);   //获取窗口标题
        [DllImport("USER32.DLL")]
        public static extern IntPtr GetWindow(IntPtr hWnd, int wCmd);       //获取窗口

        /*发送消息的结构体*/
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(
            IntPtr hWnd,
            int Msg,
            int wParam,
            //ref COPYDATASTRUCT lParam     //通过结构发送,需要接收窗口接收程序
            string lParam           //通过字符串发送窗口自动接收
        );       

 

  public enum WindowSearch
        {
            GW_HWNDFIRST = 0, //同级别第一个
            GW_HWNDLAST = 1, //同级别最后一个
            GW_HWNDNEXT = 2, //同级别下一个
            GW_HWNDPREV = 3, //同级别上一个
            GW_OWNER = 4, //属主窗口
            GW_CHILD = 5 //子窗口}获取与指定窗口具有指定关系的窗口的句柄
        }

  /// <summary>
        /// 获取窗口句柄,发送信息
        /// </summary>
        private void Sent_Msg()
        {

            /*C#进程通信(Server): 主进程的tilte*/
            IntPtr WINDOW_HANDLER = FindWindow(null, “test.txt - 记事本”);//参数:窗口的类,窗口的标题:微信
            if (WINDOW_HANDLER == IntPtr.Zero)
            {
                Result.Text = string.Format("找不到{0}的句柄:", KeyWord.Text);
            }
            else
            {
                int age = 12;
                byte[] sarr = System.Text.Encoding.Default.GetBytes(SentWord.Text);
                int len = sarr.Length;
                COPYDATASTRUCT cds;
                cds.dwData = (IntPtr)age;
                cds.lpData = SentWord.Text;
                cds.cbData = len + 1;

                Result.Text = string.Format("{0}句柄:{1}", KeyWord.Text, Convert.ToString((int)WINDOW_HANDLER, 16));
                //修改窗口标题
                //SetWindowText((int)WINDOW_HANDLER, "C#");
                //StringBuilder s = new StringBuilder(512);
                //获取控件标题
                //int i = GetWindowText(WINDOW_HANDLER, s, s.Capacity);
                //Result.Text += "\n"+string.Format("句柄{0}的caption:{1}", Convert.ToString((int)WINDOW_HANDLER, 16), s.ToString());

                IntPtr loginIntPtr = FindWindowEx(WINDOW_HANDLER, 0, null, null);       //获取子窗口
                while (loginIntPtr != IntPtr.Zero){
                    StringBuilder s = new StringBuilder(512);
                    int i = GetWindowText(loginIntPtr, s, s.Capacity);
                    Result.Text += "\n" + string.Format("句柄{0}的caption:{1}", Convert.ToString((int)loginIntPtr, 16), s.ToString());
                    //更改文本内容
                    SendMessage(loginIntPtr, 0x0C, 0, SentWord.Text);       //发送编辑文本信息命令
                    loginIntPtr = GetWindow(loginIntPtr, (int)WindowSearch.GW_HWNDNEXT);    //循环获取同等级下一个窗口
                }

            }
        }

 

posted @ 2020-11-28 14:32  棂信  阅读(511)  评论(0)    收藏  举报