2010-01-07 4 views
1

C# .NET에서 sendkeys를 사용하고 있습니다. 편지, 화살표 키를 가지고 일을 시작합니다. 상황에 맞는 메뉴를 마우스 오른쪽 버튼으로 클릭하는 방법을 알 수 없습니다. 내 키보드의 키를 눌러서 할 수 있다는 것을 알고 있지만 msg를 보내는 방법을 모릅니다. 내가 어떻게 할? 나는 googled와 톱.NET에서 SendKeys를 마우스 오른쪽 버튼으로 클릭하십시오.

new MenuItem().PerformClick(); 

그러나 나는 어떤 영향을 볼 수 없었다. 키가 다른 응용 프로그램으로 전송됩니다.

답변

3

당신은 USER32.DLL을 포장 할 수 I got the general idea from here

편집 : 나는 될 것이다, POSX 및 꽃다발에 추가 마우스 좌표.

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

.NET SendKeys 클래스를 사용하여 마우스 입력을 보낼 수 없습니다. 적어도 내가 아는 것도 아니고 문서화되어 있지도 않습니다. 이를 수행하는 가장 좋은 방법은 WinAPI로 전환하고 SendInput 메서드를 사용하는 것입니다. 이 함수는 .NET에서 DllImport ("user32.dll"의 경우)을 사용하고 구조의 경우 StructLayout을 사용하여 .NET에서 사용할 수 있습니다.

그럼 당신은 다음과 같이 호출 할 것이다

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))); 
2

키를 잘 어떤 상황에서 마우스 오른쪽 버튼과 같은 기능을 수행하는 스페이스 바의 몇 군데 위치에 당신이 언급하는 가정은 는 {메뉴}은 당신이 원하는 특수 키 될 수있다 보내다. 일부 SendKeys 변형에서 구현되지 않으며 C# .NET의 최신 버전이 확실하지 않습니다.

0

@Sparr에 표시된 것처럼 {MENU} 키는 항상 사용할 수있는 것은 아닙니다. 그러나 shift-F10은 대부분의 Windows 응용 프로그램에서 컨텍스트 메뉴를 표시합니다. 그래서 SendKeys.SendWait("+{F10}");가 작동합니다.

관련 문제