繁体   English   中英

C#Webbrowser-触发右键

[英]C# webbrowser - trigger right click

我正在Visual Studio上编写一些代码,以便从网页中获取一些信息。 现在,我需要打开一个html元素的上下文菜单,并且正在寻找类似的内容:

webbrowser.Navigate("javascript: document.getElementsByClassName('className')[1].rightclick();void(0);");

但是,不幸的是,我注意到Javascript中仅存在click()函数。 有什么解决方法吗?

谢谢你们!

您可以按照以下步骤进行操作:

  1. 获取web-browser control在窗体上的位置:

     Point controlLoc = this.PointToScreen(webBrowser1.Location); 
  2. 获取您的HtmlElement在网络浏览器控件上的位置

     X= element.OffsetRectangle.Left; Y =element.OffsetRectangle.Top; 
  3. 总结您的职位:

     controlLoc.X = controlLoc.X + element.OffsetRectangle.Left; controlLoc.Y = controlLoc.Y + element.OffsetRectangle.Top; 
  4. 将鼠标位置设置为新位置:

     Cursor.Position = controlLoc; 
  5. 模拟鼠标右键单击:

     MouseSimulator.ClickRightMouseButton(); 

完整的代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {

            webBrowser1.DocumentText = "<button class=\"mybtn\" type=\"submit\"> Right click";
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
        }

        void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            foreach (HtmlElement element in webBrowser1.Document.GetElementsByTagName("button"))
            {
                if (element.GetAttribute("ClassName") == "mybtn")
                {
                    Point controlLoc = this.PointToScreen(webBrowser1.Location);
                    //Get Element Posation
                    controlLoc.X= controlLoc.X + element.OffsetRectangle.Left;
                    controlLoc.Y = controlLoc.Y + element.OffsetRectangle.Top;
                    Cursor.Position = controlLoc;
                    MouseSimulator.ClickRightMouseButton();
                }
            }
        }
    }

    public class MouseSimulator
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

        [StructLayout(LayoutKind.Sequential)]
        struct INPUT
        {
            public SendInputEventType type;
            public MouseKeybdhardwareInputUnion mkhi;
        }
        [StructLayout(LayoutKind.Explicit)]
        struct MouseKeybdhardwareInputUnion
        {
            [FieldOffset(0)]
            public MouseInputData mi;

            [FieldOffset(0)]
            public KEYBDINPUT ki;

            [FieldOffset(0)]
            public HARDWAREINPUT hi;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct KEYBDINPUT
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
        [StructLayout(LayoutKind.Sequential)]
        struct HARDWAREINPUT
        {
            public int uMsg;
            public short wParamL;
            public short wParamH;
        }
        struct MouseInputData
        {
            public int dx;
            public int dy;
            public uint mouseData;
            public MouseEventFlags dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
        [Flags]
        enum MouseEventFlags : uint
        {
            MOUSEEVENTF_MOVE = 0x0001,
            MOUSEEVENTF_LEFTDOWN = 0x0002,
            MOUSEEVENTF_LEFTUP = 0x0004,
            MOUSEEVENTF_RIGHTDOWN = 0x0008,
            MOUSEEVENTF_RIGHTUP = 0x0010,
            MOUSEEVENTF_MIDDLEDOWN = 0x0020,
            MOUSEEVENTF_MIDDLEUP = 0x0040,
            MOUSEEVENTF_XDOWN = 0x0080,
            MOUSEEVENTF_XUP = 0x0100,
            MOUSEEVENTF_WHEEL = 0x0800,
            MOUSEEVENTF_VIRTUALDESK = 0x4000,
            MOUSEEVENTF_ABSOLUTE = 0x8000
        }
        enum SendInputEventType : int
        {
            InputMouse,
            InputKeyboard,
            InputHardware
        }

        public static void ClickRightMouseButton()
        {
            INPUT mouseDownInput = new INPUT();
            mouseDownInput.type = SendInputEventType.InputMouse;
            mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTDOWN;
            SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));

            INPUT mouseUpInput = new INPUT();
            mouseUpInput.type = SendInputEventType.InputMouse;
            mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTUP;
            SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT()));
        }
    }

结果:

在此处输入图片说明

您可以按照以下步骤

第1步

创建一个新的Windows窗体应用程序,然后将一个TextBox和一个ContextMenuStrip控件拖到窗体上。 将TextBox的MultiLine属性设置为true,将ContextMenuStrip属性设置为contextMenuStrip1,以覆盖TextBox的默认ContextMenu(如下图所示)。 看到: 在此处输入图片说明

第2步

与在TextBox控件的默认ContextMenuStrip中一样,在ContextMenuStrip中添加六个菜单项,在撤消,删除和“全选”菜单项之后,使用三个分隔符来撤消,剪切,复制,粘贴,删除和“全选”。 在ContextMenuStrip字体,前景色和背景色中添加三个以上的菜单项,以更改文本框的字体,文本颜色和背景颜色。 contextMenuStrip1应该看起来像上面的第一个图一样。 您可以参考我以前的文章以添加上下文菜单。

将这些菜单项的Name属性设置为与Text相同。 像菜单项“撤消”一样,将其名称设置为“撤消”。

第三步

在contextMenuStrip1的Opening事件中添加以下代码,以根据某些条件禁用ToolStripMenuItems(请参阅注释)。 看到:

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
    // Disable Undo if CanUndo property returns false
    if (textBox1.CanUndo)
    {
        contextMenuStrip1.Items["Undo"].Enabled = true;
    }
    else
    {
        contextMenuStrip1.Items["Undo"].Enabled = false;
    }


// Disable Cut, Copy and Delete if any text is not selected in TextBox
if (textBox1.SelectedText.Length == 0)
{
    contextMenuStrip1.Items["Cut"].Enabled = false;
    contextMenuStrip1.Items["Copy"].Enabled = false;
    contextMenuStrip1.Items["Delete"].Enabled = false;
}
else
{
    contextMenuStrip1.Items["Cut"].Enabled = true;
    contextMenuStrip1.Items["Copy"].Enabled = true;
    contextMenuStrip1.Items["Delete"].Enabled = true;
}

// Disable Paste if Clipboard does not contains text
if (Clipboard.ContainsText())
{
    contextMenuStrip1.Items["Paste"].Enabled = true;
}
else
{
    contextMenuStrip1.Items["Paste"].Enabled = false;
}

// Disable Select All if TextBox is blank
if (textBox1.Text.Length == 0)
{
    contextMenuStrip1.Items["SelectAll"].Enabled = false;
}
else
{
    contextMenuStrip1.Items["SelectAll"].Enabled = true;
}

}

第四步

在ToolStripMenuItems的click事件中添加以下代码:

private void Undo_Click(object sender, EventArgs e)
{
    textBox1.Undo();
}

private void Cut_Click(object sender, EventArgs e)
{
    textBox1.Cut();
}

private void Copy_Click(object sender, EventArgs e)
{
    textBox1.Copy();
}

private void Paste_Click(object sender, EventArgs e)
{
    textBox1.Paste();
}

private void Delete_Click(object sender, EventArgs e)
{
    int SelectionIndex = textBox1.SelectionStart;
    int SelectionCount = textBox1.SelectionLength;
    textBox1.Text = textBox1.Text.Remove(SelectionIndex, SelectionCount);
    textBox1.SelectionStart = SelectionIndex;
}

private void SelectAll_Click(object sender, EventArgs e)
{
    textBox1.SelectAll();
}

private void Font_Click(object sender, EventArgs e)
{
    FontDialog fontDialog = new FontDialog();
    if (fontDialog.ShowDialog() == DialogResult.OK)
    {
        textBox1.Font = fontDialog.Font;
    }
}

private void Forecolor_Click(object sender, EventArgs e)
{
    ColorDialog colorDialog = new ColorDialog();
    if (colorDialog.ShowDialog() == DialogResult.OK)
    {
        textBox1.ForeColor = colorDialog.Color;
    }
}

private void Backcolor_Click(object sender, EventArgs e)
{
    ColorDialog colorDialog = new ColorDialog();
    if (colorDialog.ShowDialog() == DialogResult.OK)
    {
        textBox1.BackColor = colorDialog.Color;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM