我需要在WPF应用程序中使用以下C ++函数:
/****************************************
* BOOL WINAPI SetWindowFeedbackSetting(
* _In_ HWND hwnd,
* _In_ FEEDBACK_TYPE feedback,
* _In_ DWORD dwFlags,
* _In_ UINT32 size,
* _In_opt_ const VOID *configuration
*);
*****************************************/
但是我不确定如何制造它以及如何使用它。这就是我到目前为止所做的:
public enum FEEDBACK_TYPE : uint {
FEEDBACK_TOUCH_CONTACTVISUALIZATION = 1,
FEEDBACK_PEN_BARRELVISUALIZATION = 2,
FEEDBACK_PEN_TAP = 3,
FEEDBACK_PEN_DOUBLETAP = 4,
FEEDBACK_PEN_PRESSANDHOLD = 5,
FEEDBACK_PEN_RIGHTTAP = 6,
FEEDBACK_TOUCH_TAP = 7,
FEEDBACK_TOUCH_DOUBLETAP = 8,
FEEDBACK_TOUCH_PRESSANDHOLD = 9,
FEEDBACK_TOUCH_RIGHTTAP = 10,
FEEDBACK_GESTURE_PRESSANDTAP = 11,
FEEDBACK_MAX = 0xFFFFFFFF
}
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)] // (1)
public static extern bool SetWindowFeedbackSetting(
[In] IntPtr hwnd,
[In] FEEDBACK_TYPE feedback,
[In] uint dwFlags,
[In] uint size, // (2)
[In, Optional] IntPtr configuration // (3)
);
首先,是(1),(2),(3)是否正确?
其次,如果我想根据这个C ++函数调用PInvoke这个函数:
BOOL fEnabled = FALSE;
BOOL res = SetWindowFeedbackSetting(
hwnd,
FEEDBACK_TOUCH_CONTACTVISUALIZATION,
0,
sizeof(fEnabled),
&fEnabled
);
发送HWND和布尔值的方式是什么?
我问这个问题是为了更好地理解pinvoke \ Marshal机制,也因为我尝试的方式不起作用。
由于
答案 0 :(得分:1)
您的翻译准确无误。但就个人而言,为了方便起见,我会针对您需要使用的每种类型进行一次重载。对于布尔值:
[DllImport("user32.dll"])
public static extern bool SetWindowFeedbackSetting(
IntPtr hwnd,
FEEDBACK_TYPE feedback,
uint dwFlags,
uint size,
[In] ref bool configuration
);
我删除了不需要的属性,因为它们重新声明了默认值。
请记住,Win32 BOOL
类型是C#bool
的默认编组选项,是4字节类型。所以你必须传递4作为大小。
请参阅此问题以了解如何获取WPF窗口的窗口句柄:How to get the hWnd of Window instance?
答案 1 :(得分:0)
从我记忆中来看,P / Invoke机制在传递/返回.NET的bool方面存在问题。我会这样做:
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)] // (1)
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowFeedbackSetting(
[In] IntPtr hwnd,
[In] FEEDBACK_TYPE feedback,
[In] uint dwFlags,
[In] uint size, // (2)
[In, Optional] IntPtr configuration // (3)
);
然后,您必须获取WPF中当前窗口的HWND。这个问题:How to get the hWnd of Window instance?应该对此有所帮助。
为方便起见:
Window window = Window.GetWindow(this);
var wih = new WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;
(归功于Drahcir)
最后,要获取布尔值的地址,我会执行以下操作:
int myBool; // Win32's BOOL is actually an 4-byte integral number, 0 or non-zero
GCHandle handle = GCHandle.Alloc(myBool, GCHandleType.Pinned);
try
{
IntPtr ptr = handle.AddrOfPinnedObject();
// use ptr
}
finally
{
handle.Free();
}