用PostMessage模拟点击网页的弹出框,一个“确定”一个“取消”,现在通过句柄点击“确定”没问题,通过句柄点击点击“取消”的时候却还是点击了“确定”,两个按钮的句柄是没有问题的。然后我先给“取消”按钮的句柄设置了setActiveWindow或setFocus,可还是不行,该怎么办啊各位大哥哥大姐姐

解决方案 »

  1.   

    public partial class Form1 : Form
    {
        delegate bool EnumChildProc(IntPtr hWnd, IntPtr lParam);    [DllImport("user32")]
        static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildProc callback, IntPtr lParam);    [DllImport("user32.dll")]
        static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);    [DllImport("User32.dll")]
        static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);    public Form1()
        {
            InitializeComponent();        var webBrowser1 = new WebBrowser();
            webBrowser1.Name = "webBrowser1";
            webBrowser1.Height = ClientSize.Height - 25;
            webBrowser1.Dock = DockStyle.Top;
            this.Controls.Add(webBrowser1);        var button1 = new Button();
            button1.Location = (Point)this.ClientSize - button1.Size;
            button1.Left /= 2;
            button1.Anchor = AnchorStyles.Bottom;
            button1.Text = ">>|";
            button1.Click += this.button1_Click;
            this.Controls.Add(button1);        this.SizeChanged += (sender, e) => webBrowser1.Height = ClientSize.Height - button1.Height;
            this.WindowState = FormWindowState.Maximized;        webBrowser1.Navigate("http://douban.fm/");
        }    public List<IntPtr> FindChildWindows(IntPtr hParent)
        {
            var handles = new List<IntPtr>();
            EnumChildWindows(hParent, (hChild, p) => {
                handles.Add(hChild); 
                handles.AddRange(FindChildWindows(hChild));
                return true; 
            }, IntPtr.Zero);
            return handles;
        }    private void button1_Click(object sender, EventArgs e)
        {
            var sb = new StringBuilder(100);
            var ie = FindChildWindows(this.Handle).First(hwnd =>
            {
                GetClassName(hwnd, sb, sb.Capacity);
                return sb.ToString().Contains("Internet Explorer");
            });
            var doc = ((WebBrowser)this.Controls["webBrowser1"]).Document;
            var player = doc.All["radioplayer"];        Point pos = new Point();
            for (var el = player; el != null; el = el.OffsetParent)
                pos.Offset(el.OffsetRectangle.Location);        var scrollPos = doc.GetElementsByTagName("html")[0].ScrollRectangle.Location;
            pos.Offset(385 - scrollPos.X, 150 - scrollPos.Y);        // 模拟鼠标点击
            const int WM_LBUTTONDOWN = 0x201;
            const int WM_LBUTTONUP = 0x202;        IntPtr lParam = (IntPtr)((pos.Y << 16) | pos.X);
            SendMessage(ie, WM_LBUTTONDOWN, IntPtr.Zero, lParam);
            SendMessage(ie, WM_LBUTTONUP, IntPtr.Zero, lParam);
        }
    }
      

  2.   

    直接发送 WM_COMMAND 消息。之前用 GetDlgCtrlID API 获取 ID。