2010-03-24 14 views
7

estoy mirando a la función RegisterHotKey:¿Cómo pasar el puntero nulo a la API de Win32 en 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 
); 

He estado usando IntPtr que pase en el primer argumento, que funciona bien en la mayoría de los casos. Pero ahora necesito pasar deliberadamente un puntero nulo como el primer argumento, que IntPtr (deliberadamente) no hará. Soy nuevo en .Net, y esto me tiene perplejo. ¿Cómo puedo hacer esto?

+0

Otras formas de pasar el primer argumento: https://stackoverflow.com/questions/47997942/how-do-i-handle-optional -c-dll-struct-arguments-in-c-sharp – River

Respuesta

15

Uso IntPtr.Zero para NULL

Por ejemplo:

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, tenía la impresión de que IntPtr.Zero representaba un puntero no nulo a un valor entero de 0. –

+2

@Thom, 'IntPtr.Zero' es una puntero con la dirección de 0. En realidad, no apunta a nada, ya que desreferenciar la dirección 0 casi con seguridad provocará un bloqueo o una excepción de rts. El valor NULL de C++ tiene el mismo comportamiento (puntero con dirección de 0) por lo que se combina muy bien con 'IntPtr.Zero' – JaredPar

Cuestiones relacionadas