zoukankan      html  css  js  c++  java
  • 找到webbrowser中的控件句柄发送消息-转

    Win32ApiWrapper类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace projectfortab4
    {
        public class Win32ApiWrapper
        {
            public const int WM_KEYDOWN = 0x100;
            public const int WM_KEYUP = 0x101;
            public const int VK_CONTROL = 0x11;
            public const int VK_F5 = 0x74;
            public const int KEYEVENTF_KEYUP = 0x2;
            public const int VK_MENU = 0x12;
            public const int WM_SETTEXT = 0xC;
            public const int WM_CLEAR = 0x303;
            public const int BN_CLICKED = 0;
            public const int WM_LBUTTONDOWN = 0x201;
            public const int WM_LBUTTONUP = 0x202;
            public const int WM_CLOSE = 0x10;
            public const int WM_COMMAND = 0x111;
            public const int WM_SYSKEYDOWN = 0x104;
            public const int GW_HWNDNEXT = 2;
            public const int WM_CLICK = 0x00F5;

            private static Dictionary<string, byte> keycode = new Dictionary<string, byte>(); 

            private delegate bool WNDENUMPROC(IntPtr hWnd, int lParam);

            static Win32ApiWrapper()
            {
                keycode.Add("A", 65);
                keycode.Add("B", 66);
                keycode.Add("C", 67);
                keycode.Add("D", 68);
                keycode.Add("E", 69);
                keycode.Add("F", 70);
                keycode.Add("G", 71);
                keycode.Add("H", 72);
                keycode.Add("I", 73);
                keycode.Add("J", 74);
                keycode.Add("K", 75);
                keycode.Add("L", 76);
                keycode.Add("M", 77);
                keycode.Add("N", 78);
                keycode.Add("O", 79);
                keycode.Add("P", 80);
                keycode.Add("Q", 81);
                keycode.Add("R", 82);
                keycode.Add("S", 83);
                keycode.Add("T", 84);
                keycode.Add("U", 85);
                keycode.Add("V", 86);
                keycode.Add("W", 87);
                keycode.Add("X", 88);
                keycode.Add("Y", 89);
                keycode.Add("Z", 90);
                keycode.Add("0", 48);
                keycode.Add("1", 49);
                keycode.Add("2", 50);
                keycode.Add("3", 51);
                keycode.Add("4", 52);
                keycode.Add("5", 53);
                keycode.Add("6", 54);
                keycode.Add("7", 55);
                keycode.Add("8", 56);
                keycode.Add("9", 57);
                keycode.Add(".", 0x6E);
                keycode.Add("LEFT", 0x25);
                keycode.Add("UP", 0x26);
                keycode.Add("RIGHT", 0x27);
                keycode.Add("DOWN", 0x28);
                keycode.Add("-", 0x6D); 
            }

            [DllImport("Gdi32.dll")]
            public extern static int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);

            [DllImport("user32.dll")]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

            [DllImport("user32.dll")]
            public extern static IntPtr GetWindow(IntPtr hWnd, int wCmd);

            [DllImport("user32.dll", EntryPoint = "SendMessage")]
            public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);

            [DllImport("user32.dll ")]
            public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string FrmText);

            [DllImport("user32.DLL")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

            [DllImport("user32.dll")]
            private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

            [DllImport("user32.dll")]
            private static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);

            [DllImport("user32.dll")]
            private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

            [DllImport("user32.dll")]
            private static extern bool EnumChildWindows(IntPtr hWndParent, WNDENUMPROC lpEnumFunc, int lParam);

            [DllImport("user32.dll", EntryPoint = "SendMessage")]
            public static extern int SendTxtMessage(int hWnd,
                // handle to destination window               
                int Msg, // message               
                int wParam, // first message parameter               
                char[] lParam             // int  lParam // second message parameter           
                );

            [DllImport("user32.dll", EntryPoint = "SendMessage")]
            public static extern int SendMessage(
                int hWnd, // handle to destination window               
                int Msg, // message               
                int wParam, // first message parameter                
                int lParam // second message parameter         
                );

            [DllImport("user32.dll")]
            public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);


            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static public extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, uint flags);

            [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
            public static extern bool SetWindowPos(IntPtr hWnd, int HWND_TOPMOST, int x, int y, int Width, int Height, uint flags);


            [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "PostMessage")]
            public static extern IntPtr PostMessage(IntPtr hwndParent, int hwndChildAfter, IntPtr wParam, string lpszWindow);

            

            /// <summary>
            /// 获取桌面所有的窗口
            /// </summary>
            /// <returns></returns>
            public static WindowInfo[] GetAllDesktopWindows()
            {
                List<WindowInfo> wndList = new List<WindowInfo>();
                EnumWindows(delegate(IntPtr hWnd, int lParam)
                {
                    WindowInfo wnd = new WindowInfo();
                    StringBuilder sb = new StringBuilder(256);
                    wnd.hWnd = hWnd;
                    GetWindowTextW(hWnd, sb, sb.Capacity);
                    wnd.SzWindowName = sb.ToString();
                    GetClassNameW(hWnd, sb, sb.Capacity);
                    wnd.SzClassName = sb.ToString();
                    wndList.Add(wnd);
                    return true;
                }, 0);

                return wndList.ToArray();
            }


            public static List<WindowInfo> GetWindowByParentHwndAndClassName(IntPtr parentHwnd, string className)
            {
                List<WindowInfo> wndList = new List<WindowInfo>();
                EnumChildWindows(parentHwnd, delegate(IntPtr hWnd, int lParam)
                {
                    WindowInfo wnd = new WindowInfo();
                    StringBuilder sb = new StringBuilder(256);
                    wnd.hWnd = hWnd;
                    GetWindowTextW(hWnd, sb, sb.Capacity);
                    wnd.SzWindowName = sb.ToString();
                    GetClassNameW(hWnd, sb, sb.Capacity);
                    wnd.SzClassName = sb.ToString();
                    wndList.Add(wnd);
                    return true;
                }, 0);
                return wndList.Where(o => o.SzClassName == className).ToList();
            }


            
            public static List<WindowInfo> GetChildWindowsByParentHwnd(IntPtr parentHwnd)
            {
                List<WindowInfo> childWndList = new List<WindowInfo>();
                EnumChildWindows(parentHwnd, delegate(IntPtr hWnd, int lParam)
                {
                    WindowInfo wnd = new WindowInfo();
                    StringBuilder sb = new StringBuilder(256);
                    wnd.hWnd = hWnd;
                    GetWindowTextW(hWnd, sb, sb.Capacity);
                    wnd.SzWindowName = sb.ToString();
                    GetClassNameW(hWnd, sb, sb.Capacity);
                    wnd.SzClassName = sb.ToString();
                    childWndList.Add(wnd);
                    return true;
                }, 0);

                return childWndList;
            }
            


        }

       

        public class WindowInfo
        {
            public IntPtr hWnd { get; set; }

            public string SzWindowName { get; set; }

            public string SzClassName { get; set; }
        }
    }

    WinAPI 类:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Runtime.InteropServices;

    namespace projectfortab4
    {
        class WinAPI
        {
            #region WinodwsAPI
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);

            [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
            private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

            [DllImport("user32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);

            [DllImport("User32.DLL")]
            public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
            public static int IDM_VIEWSOURCE = 2139;
            public static uint WM_COMMAND = 0x0111;

            [DllImport("user32.dll", EntryPoint = "GetParent")]
            public static extern IntPtr GetParent(IntPtr hWnd);

            [DllImport("user32.dll", EntryPoint = "GetCursorPos")]
            public static extern bool GetCursorPos(out Point pt);

            [DllImport("user32.dll", EntryPoint = "WindowFromPoint", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern IntPtr WindowFromPoint(Point pt);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowRect(IntPtr hwnd, ref Rectangle rc);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetClientRect(IntPtr hwnd, ref Rectangle rc);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);

            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
            public static extern int ScreenToClient(IntPtr hWnd, ref Rectangle rect);
            #endregion

            #region 封装API方法
            /// <summary>
            /// 找到句柄
            /// </summary>
            /// <param name="IpClassName">类名</param>
            /// <returns></returns>
            public static IntPtr GetHandle(string IpClassName)
            {
                return FindWindow(IpClassName, null);
            }       

            /// <summary>
            /// 找到句柄
            /// </summary>
            /// <param name="p">坐标</param>
            /// <returns></returns>
            public static IntPtr GetHandle(Point p)
            {
                return WindowFromPoint(p);
            }

            //鼠标位置的坐标
            public static Point GetCursorPosPoint()
            {
                Point p = new Point();
                if (GetCursorPos(out p))
                {
                    return p;
                }
                return default(Point);
            }

            /// <summary>
            /// 子窗口句柄
            /// </summary>
            /// <param name="hwndParent">父窗口句柄</param>
            /// <param name="hwndChildAfter">前一个同目录级同名窗口句柄</param>
            /// <param name="lpszClass">类名</param>
            /// <returns></returns>
            public static IntPtr GetChildHandle(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass)
            {
                return FindWindowEx(hwndParent, hwndChildAfter, lpszClass, null);
            }

            /// <summary>
            /// 全部子窗口句柄
            /// </summary>
            /// <param name="hwndParent">父窗口句柄</param>
            /// <param name="className">类名</param>
            /// <returns></returns>
            public static List<IntPtr> GetChildHandles(IntPtr hwndParent, string className)
            {
                List<IntPtr> resultList = new List<IntPtr>();
                for (IntPtr hwndClient = GetChildHandle(hwndParent, IntPtr.Zero, className); hwndClient != IntPtr.Zero; hwndClient = GetChildHandle(hwndParent, hwndClient, className))
                {
                    resultList.Add(hwndClient);
                }

                return resultList;
            }

            /// <summary>
            /// 给窗口发送内容
            /// </summary>
            /// <param name="hWnd">句柄</param>
            /// <param name="lParam">要发送的内容</param>
            public static void SetText(IntPtr hWnd, string lParam)
            {
                SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, lParam);
            }
            private const int WM_SETTEXT = 0x000C;

            /// <summary>
            /// 获得窗口内容或标题
            /// </summary>
            /// <param name="hWnd">句柄</param>
            /// <returns></returns>
            public static string GetText(IntPtr hWnd)
            {
                StringBuilder result = new StringBuilder(128);
                GetWindowText(hWnd, result, result.Capacity);
                return result.ToString();
            }

            /// <summary>
            /// 找类名
            /// </summary>
            /// <param name="hWnd">句柄</param>
            /// <returns></returns>
            public static string GetClassName(IntPtr hWnd)
            {
                StringBuilder lpClassName = new StringBuilder(128);
                if (GetClassName(hWnd, lpClassName, lpClassName.Capacity) == 0)
                {
                    throw new Exception("not found IntPtr!");
                }
                return lpClassName.ToString();
            }

            /// <summary>
            /// 窗口在屏幕位置
            /// </summary>
            /// <param name="hWnd">句柄</param>
            /// <returns></returns>
            public static Rectangle GetWindowRect(IntPtr hWnd)
            {
                Rectangle result = default(Rectangle);
                GetWindowRect(hWnd, ref result);
                return result;
            }

            /// <summary>
            /// 窗口相对屏幕位置转换成父窗口位置
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="rect"></param>
            /// <returns></returns>
            public static Rectangle ScreenToClient(IntPtr hWnd, Rectangle rect)
            {
                Rectangle result = rect;
                ScreenToClient(hWnd, ref result);
                return result;
            }

            /// <summary>
            /// 窗口大小
            /// </summary>
            /// <param name="hWnd"></param>
            /// <returns></returns>
            public static Rectangle GetClientRect(IntPtr hWnd)
            {
                Rectangle result = default(Rectangle);
                GetClientRect(hWnd, ref result);
                return result;
            }

            public static void GetInfo(IntPtr vHandle)
            {
                SendMessage(vHandle, WM_COMMAND, IDM_VIEWSOURCE, (int)vHandle);
               
            }

            #endregion

        }
    }

    button 点击事件:

    private void button1_Click(object sender, EventArgs e)
            {
                var termname = this.Text;
                var win = Win32ApiWrapper.GetAllDesktopWindows().Where(o => o.SzWindowName == termname).FirstOrDefault();
                if (win != null)
                {
                    IntPtr vHandles = webBrowser1.Handle;
                    vHandles = WinAPI.GetChildHandle(vHandles, IntPtr.Zero, "Shell Embedding");
                    vHandles = WinAPI.GetChildHandle(vHandles, IntPtr.Zero, "Shell DocObject View");
                    vHandles = WinAPI.GetChildHandle(vHandles, IntPtr.Zero, "Internet Explorer_Server");
                    //这里输出在webBrowser1中获取的html源码
                    WinAPI.GetInfo(vHandles);

                    var passwordCtrl = Win32ApiWrapper.GetChildWindowsByParentHwnd(win.hWnd).Where(o => o.SzClassName == "Edit").FirstOrDefault();
                    if (passwordCtrl != null)
                    {

                        //获得焦点
                        IntPtr hwnd_top = IntPtr.Zero;
                        uint swp_NoMovie = 2;
                        uint swp_NOSIZE = 1;
                        uint swp_NOACTIVATE = 0x10;
                        uint swp_SHOWWINDOW = 0x40;
                        Win32ApiWrapper.SetWindowPos(passwordCtrl.hWnd, hwnd_top, 0, 0, 0, 0, swp_NoMovie | swp_NOSIZE | swp_NOACTIVATE | swp_SHOWWINDOW);
                        Win32ApiWrapper.PostMessage(passwordCtrl.hWnd, Win32ApiWrapper.WM_LBUTTONDOWN, IntPtr.Zero, "");
                        Win32ApiWrapper.PostMessage(passwordCtrl.hWnd, Win32ApiWrapper.WM_LBUTTONUP, IntPtr.Zero, "");


                        
                        //写东西进去
                        //1种方法:
                        SendKeys.Send("{TAB}");
                        //2种方法
                        //EsaiSuperKeys.InputHelper.WinRingInput("As");
                        //3种方法
                        WinAPI.SetText(passwordCtrl.hWnd, "aaa");
                        //WinAPI.SetText(passwordCtrl.hWnd, "assdaa");
                    }
                }
            }

  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/browser/p/4458717.html
Copyright © 2011-2022 走看看