【问题标题】:Right click with SendKeys in .NET在 .NET 中右键单击 SendKeys
【发布时间】:2014-05-14 13:11:37
【问题描述】:

我在 C# .NET 中使用 sendkeys。我有字母、方向键和输入工作。我不知道如何发送右键单击上下文菜单。我知道我可以按键盘上的一个键来执行此操作,但我不知道如何发送消息。我如何能?我用谷歌搜索并看到了

new MenuItem().PerformClick();

作为一种解决方案,但我没有看到任何影响。密钥正在发送到另一个应用程序。

【问题讨论】:

    标签: c# .net contextmenu sendkeys


    【解决方案1】:

    可以封装user32.dll,I got the general idea from here

    编辑: 我添加了posX和posY,这将是鼠标坐标。

    using System;
    using System.Runtime.InteropServices;
    
    namespace WinApi
    {  
        public class Mouse
        { 
                [DllImport("user32.dll")]
                private static extern void mouse_event(UInt32 dwFlags,UInt32 dx,UInt32 dy,UInt32 dwData,IntPtr dwExtraInfo);
    
                private const UInt32 MouseEventRightDown = 0x0008;
                private const UInt32 MouseEventRightUp = 0x0010;
    
                public static void SendRightClick(UInt32 posX, UInt32 posY)
                {
                    mouse_event(MouseEventRightDown, posX, posY, 0, new System.IntPtr());
                    mouse_event(MouseEventRightUp, posX, posY, 0, new System.IntPtr());
                }    
        }
    }
    

    【讨论】:

      【解决方案2】:

      假设您指的是位于空格键右侧几个位置的键,在某些情况下执行与鼠标右键相同的操作,{MENU} 可能是您想要的特殊键发送。它没有在一些 SendKeys 变体中实现,我不确定 C#.NET 的最新版本。

      【讨论】:

        【解决方案3】:

        您无法使用 .NET SendKeys 类发送鼠标输入。至少,我不知道也没有记录。最好的方法是切换到 WinAPI 并使用SendInput 方法。您可以在 .NET 中使用 DllImport 作为函数(在“user32.dll”中)和 StructLayout 作为结构。

        然后你会想这样称呼它:

        INPUT pressRight;
        pressRight.type = MOUSE; // = 0
        pressRight.mi.dx = 0;
        pressRight.mi.dy = 0;
        pressRight.mi.mouseData = 0;
        pressRight.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN; // = 8
        pressRight.mi.time = 0;
        pressRight.mi.dwExtraInfo = IntPtr.Zero;
        
        INPUT releaseRight = pressRight;
        releaseRight.mi.dwFlags = MOUSEEVENTF_RIGHTUP; // = 10
        
        INPUT[] inputs = new INPUT[2];
        inputs[0] = pressRight;
        inputs[1] = releaseRight;
        
        SendInput(2, inputs, Marshal.SizeOf(typeof(INPUT)));
        

        【讨论】:

          【解决方案4】:

          如@Sparr 所述,{MENU} 键并不总是可用的。但是,shift-F10 会在大多数 Windows 应用程序中调出上下文菜单。所以SendKeys.SendWait("+{F10}"); 应该可以工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-12
            • 2016-08-01
            • 2012-11-06
            • 1970-01-01
            • 2011-01-11
            • 2020-11-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多