[英]C++ / C# Interop - Interop definitions for working with a predicate
因此,我試圖圍繞c ++ API編寫包裝程序,以便可以將其與C#結合使用。 c ++ api及其相關信息位於此處 。
因此,我試圖與C#代碼中的C ++ dll進行交互。 我能夠成功地做到這一點。 但是現在我掛斷電話,試圖使某個功能正常工作。 對C ++中的函數進行工作調用的示例是:
interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);
INTERCEPTION_FILTER_KEY_DOWN和INTERCEPTION_FILTER_KEY_DOWN的定義如下:
typedef int (*InterceptionPredicate)(InterceptionDevice device);
enum InterceptionKeyState
{
INTERCEPTION_KEY_DOWN = 0x00,
INTERCEPTION_KEY_UP = 0x01,
...
};
enum InterceptionFilterKeyState
{
INTERCEPTION_FILTER_KEY_DOWN = INTERCEPTION_KEY_UP,
INTERCEPTION_FILTER_KEY_UP = INTERCEPTION_KEY_UP << 1,
};
以及interception_is_keyboard可以傳遞給interception_set_filter的各種謂詞之一。 謂詞的功能以這種方式描述:
Interception_set_filter函數具有三個參數:通信上下文,函數指針和所需的過濾器。 第二個參數,即函數指針,是設備選擇謂詞,是一個接收設備ID(例如INTERCEPTION_KEYBOARD(0),INTERCEPTION_KEYBOARD(1)等)作為參數的函數,如果傳遞的設備ID是設備之一,則返回true。必須通過所選過濾器過濾的結果;對於不通過此過濾器過濾的設備,結果為false。 因此,interception_set_filter的工作方式是掃描所有可能的設備,並使用提供的謂詞作為標准來了解應將提供的過濾器應用於哪些設備。
此外,在代碼中定義了實現此謂詞interception_is_keyboard簽名的方法,因此:
int interception_is_keyboard(InterceptionDevice device)
{
return device >= INTERCEPTION_KEYBOARD(0) && device <= INTERCEPTION_KEYBOARD(INTERCEPTION_MAX_KEYBOARD - 1);
}
.h文件中interception_set_filter的定義為:
void ITERCEPTION_API interception_set_filter(InterceptionContext context, InterceptionPredicate predicate, InterceptionFilter filter);
ITERCEPTION_API在哪里:
#define ITERCEPTION_API __declspec(dllimport)
因此,我的問題是,如何設置才能調用C#應用程序(托管代碼)的interception_set_filter並使用謂詞interception_is_keyboard?
您可以使用C#委托為PInvoke參數創建函數指針。 這里也提出了類似的問題。
EDIT過濾器由枚舉或Int32
。 這樣就知道了。
編輯2漢斯·帕桑特(Hans Passant)評論說,我不需要使用[MarshalAs(UnmanagedType.FunctionPtr)]
,假設(默認)我學到了一些新知識,謝謝漢斯)。 他還指出:“確保該委托保持引用狀態,以免在本機代碼進行回調時收集垃圾”。 非常感謝你。
編輯3我從您提供的鏈接中讀了一點,顯然context
是一個void*
。 我會假設你還需要的PInvoke interception_create_context
獲取您的void*
,然后通過該指針。 假設您有一個有效的指針,我已經相應地調整了答案。
另外,我看不到您在哪里定義InterceptionDevice
,我現在假設為Int32
。
我的C#委托看起來像這樣:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void InterceptionPredicateType(Int32 device);
[DllImport("your.dll")]
public extern static int interception_is_keyboard(IntPtr context, InterceptionPredicateType predicate, Int32 filter);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.