2010-03-24 2 views
7

Je regarde la RegisterHotKey Fonction:Comment faire pour passer le pointeur null à l'API Win32 dans 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 
); 

Je me sers IntPtr pour passer dans le premier argument, qui fonctionne très bien dans la plupart des cas. Mais maintenant je dois délibérément passer un pointeur nul comme le premier argument, ce que IntPtr (délibérément) ne fera pas. Je suis nouveau à .Net, et ceci m'a perplexe. Comment puis-je faire ceci?

+0

D'autres façons de passer le premier argument: https://stackoverflow.com/questions/47997942/how-do-i-handle-optional -c-dll-struct-arguments-en-c-sharp – River

Répondre

15

Utilisez IntPtr.Zero pour NULL

Par exemple:

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, j'étais sous l'impression que IntPtr.Zero représentait un pointeur non nul à une valeur entière de 0. –

+2

@Thom, 'IntPtr.Zero' est un pointeur avec l'adresse de 0. Il ne pointe en fait à rien parce que déréférencer l'adresse 0 conduira presque certainement à un crash ou une exception de si rts La valeur C++ NULL a le même comportement (pointeur avec l'adresse de 0) d'où il correspond bien avec 'IntPtr.Zero' – JaredPar

Questions connexes