簡體   English   中英

P調用WPF HWND和const void *

[英]PInvoke WPF HWND and const void*

我需要在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機制,而且由於我嘗試的方法不起作用。

謝謝

您的翻譯是准確的。 但就我個人而言,為方便起見,我會為每種需要使用的類型做一個重載。 對於布爾值:

[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窗口獲取窗口句柄: 如何獲取Window實例的hWnd?

據我所知,P / Invoke機制在傳遞/返回.NET布爾值方面存在問題。 我會做:

[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。 這個問題: 如何獲取Window實例的hWnd? 在這件事上應該有所幫助。

為了您的方便:

Window window = Window.GetWindow(this);
var wih = new WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;

(信用歸德拉西爾所有)

最后,要獲取布爾值的地址,請執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM