2010-03-24 6 views
7

Sto guardando la funzione RegisterHotKey:Come passare il puntatore nullo all'API Win32 in C# .Net?

http://msdn.microsoft.com/en-us/library/ms646309(VS.85).aspx

BOOL RegisterHotKey(
    __in HWND hWnd, 
    __in int id, 
    __in UINT fsModifiers, 
    __in UINT vk 
); 

Sto usando IntPtr di passare nel primo argomento, che funziona bene nella maggior parte dei casi. Ma ora ho bisogno di passare deliberatamente un puntatore nullo come primo argomento, che non lo farò (volutamente) IntPtr. Sono nuovo di .Net, e questo mi ha lasciato perplesso. Come posso fare questo?

+0

Altri modi per passare il primo argomento: https://stackoverflow.com/questions/47997942/how-do-i-handle-optional -c-dll-struct-arguments-in-c-sharp – River

risposta

15

Usa IntPtr.Zero per NULL

Ad esempio:

public void Example() { 
    ... 
    RegisterHotKey(IntPtr.Zero, id, mod, vk); 
} 

[DllImportAttribute("user32.dll", EntryPoint="RegisterHotKey")] 
[return: MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] 
public static extern bool RegisterHotKey(
    IntPtr hWnd, 
    int id, 
    uint fsModifiers, 
    uint vk); 
+0

Ah, avevo l'impressione che IntPtr.Zero rappresentasse un puntatore non nullo a un valore intero di 0. –

+2

@Thom, 'IntPtr.Zero' è un puntatore con l'indirizzo di 0. In realtà non punta a nulla perché il dereferenziamento dell'indirizzo 0 causerà quasi certamente un arresto anomalo o un'eccezione di rts. Il valore di C++ NULL ha lo stesso comportamento (puntatore con indirizzo di 0) quindi si adatta bene con 'IntPtr.Zero' – JaredPar