c# - WebBrowser ContextMenu 菜单项的运行操作

标签 c# wpf wpf-controls browser contextmenu

我有一个带有 WebBrowser 控件的应用程序。 我通过单击按钮加载一个页面。 然后我想从 Web 浏览器的上下文菜单运行“转换为 Adob​​e PDF”操作,但是...当我尝试通过以下方式访问上下文菜单时:

foreach (MenuItem vMenuItem in WebBrowser.ContextMenu.MenuItems)
{
    if (vMenuItem.Text.Contains("onwert") && vMenuItem.Text.Contains("PDF"))
    {
        vMenuItem.PerformClick();
    }
}

IDE 在线显示错误“对象引用未设置到对象的实例”

foreach (MenuItem vMenuItem in WebBrowser.ContextMenu.MenuItems)

我没有创建自己的上下文菜单,我希望显示默认的上下文菜单。 如何访问 Web 浏览器的上下文菜单并执行该操作?

最佳答案

我也遇到了和你类似的问题。我在我的帖子 here 中提到了您的问题。 如果您仍然对此问题感兴趣,这是利用模拟点击的有效解决方案:

//Example of how to use the code:
    Point controlLoc = this.PointToScreen(webbrowser1.Location);
    controlLoc.X = controlLoc.X + webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Left+65;
    controlLoc.Y = controlLoc.Y + webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Top+50;
    Cursor.Position = controlLoc;
    MouseSimulator.ClickRightMouseButton();
    controlLoc.X = controlLoc.X + (webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Left + 95);
    controlLoc.Y = controlLoc.Y + (webbrowser1.Document.GetElementById("sbvdcapimg").OffsetRectangle.Top + 45);
    Cursor.Position = controlLoc;
    MouseSimulator.ClickLeftMouseButton();

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()));
}

public static void ClickLeftMouseButton()
{

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

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

关于c# - WebBrowser ContextMenu 菜单项的运行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264529/

相关文章:

c# - 如何在 XAML 中设置 WPF 工具包 DataGrid 左上角的样式?

c# - 在c#中格式化日期

c# - WPF Applicationdeployment.isnetworkdeployed 总是返回 false

wpf - 直到我单击其中的控件,弹出窗 Eloquent 会失去焦点并关闭

c# - java 的 -verbose :gc command line option 的 .NET 等价物是什么

c# - 按契约(Contract)进行静态检查设计

c# - 从 C# 代码动态切换 WPF 网格列的可见性

wpf - 在WPF的TreeView中将SelectedPath属性与SelectedItem同步

c# - 按钮的 WPF 样式

c# - 在 WPF 中使用 ViewModel 创建 UserControl