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- 추가 기능에서 잘 작동합니다. 내가 잘못하면 저를 바로 잡으십시오.
'[DllImport ("User32.dll", SetLastError = true)]'를 사용해보십시오. 이제'Marshal.GetLastWin32Error()'는 오류를 찾아내는 데 더 유용한 것으로 채워야합니다. – haindl
예외 메시지에서 "87"만 받았습니다. 이 예외에 대한 세부 정보를 얻지 못하고 있습니다. 도움이된다면 더 나아질 것입니다. –
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