2016-10-24 3 views
0

user32.dll의 RegisterRawInputDevices를 사용하여 키보드를 등록했지만 false를 반환합니다. VSTO 및 C#을 사용하여 Office 추가 기능을 개발 중입니다.false를 반환하는 RegisterRawInputDevices

[StructLayout(LayoutKind.Sequential)] 
public struct RAWINPUTDEVICE 
{ 
    [MarshalAs(UnmanagedType.U2)] 
    public UInt16 usUsagePage; 
    [MarshalAs(UnmanagedType.U2)] 
    public UInt16 usUsage; 
    [MarshalAs(UnmanagedType.U4)] 
    public int dwFlags; 
    public IntPtr hwndTarget; 
} 

[DllImport("User32.dll", SetLastError = true)] 
public static extern bool RegisterRawInputDevices(RAWINPUTDEVICE[] pRawInputDevice, 
    UInt32 uiNumDevices, UInt32 cbSize); 

[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

public void Register() 
{ 
    IntPtr hwnd = FindWindow("PPTFrameClass", "Presentation1 - PowerPoint"); 
    RegisterKeyboardDevice(hwnd); 
} 

public void RegisterKeyboardDevice(IntPtr hwnd) 
{ 
    const int RIDEV_INPUTSINK = 0x00000100; 
    RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[1]; 
    rid[0].usUsagePage = Convert.ToUInt16(1); 
    rid[0].usUsage = Convert.ToUInt16(6); 
    rid[0].dwFlags = RIDEV_INPUTSINK; 
    rid[0].hwndTarget = hwnd; 
    if (!RegisterRawInputDevices(rid, Convert.ToUInt32(rid.Length), 
     Convert.ToUInt32(Marshal.SizeOf(rid[0])))) 
    { 
     throw new ApplicationException("Failed to register raw input device(s). " + 
      "Error code: " + Marshal.GetLastWin32Error()); 
    } 
} 

그러나 동일한 논리가 VB.NET 및 COM- 추가 기능에서 잘 작동합니다. 내가 잘못하면 저를 바로 잡으십시오.

+0

'[DllImport ("User32.dll", SetLastError = true)]'를 사용해보십시오. 이제'Marshal.GetLastWin32Error()'는 오류를 찾아내는 데 더 유용한 것으로 채워야합니다. – haindl

+0

예외 메시지에서 "87"만 받았습니다. 이 예외에 대한 세부 정보를 얻지 못하고 있습니다. 도움이된다면 더 나아질 것입니다. –

+0

87의 Win32 오류는 16 진수로 '0x00000057'이며'ERROR_INVALID_PARAMETER'을 의미합니다. ([here] (https://msdn.microsoft.com/en-us/library/cc231199.aspx)를 참조하십시오.) 따라서 모든 매개 변수를 확인해야합니다. 내가 시도 할 다음 단계는 [여기] (http://www.pinvoke.net/default.aspx/user32.registerrawinputdevices)에 따라 첫 번째 매개 변수 또는 외부 메서드 서명에이를 추가하는 것입니다.'[MarshalAs (UnmanagedType .LPArray, SizeParamIndex = 0)] RAWINPUTDEVICE [] pRawInputDevice' – haindl

답변

0

RegisterRawInputDevices은 호출 코드와 동일한 프로세스에 속하는 창에서만 호출 할 수 있습니다.

Excel C# VSTO 추가 기능 및 Excel C# COM 추가 기능에서 코드를 테스트했으며 두 경우 모두 RegisterRawInputDevices을 Excel 창 자체 및 내부에서 만든 WPF 테스트 창에서 성공적으로 호출 할 수있었습니다. 어떤 종류의 오류없이 addin. 이 테스트를 수행 할 수있는 버전은 Excel 2016 64 비트입니다.

불행히도이 동작에 대한 참조는 없지만 의도적으로 의도적으로 설계 한 것일 수 있습니다. 잠재적으로 하이재킹 할 수 있으므로 보안 문제가있을 수 있습니다. 어떤 다른 창문과 아마도 일종의 keylogger 역할을하거나 다른 정말 나쁜 것들을하고 있습니다.

코드가 완벽하게 작동하지만 동일한 프로세스에 속한 창을 사용해야합니다. 그리고 VB.NET 추가 기능과의 차이점은이 규칙에 따라 작동하기 때문에 작동하는 것입니다.

관련 문제