Equivalencias con el API de WindowsDeclaraciones para VB6, VB .NET y C# |
Publicado el 12/Ene/2005
|
En esta página encontrarás las declaraciones tanto para VB .NET como para C# de algunas de las funciones del API de Windows, además de las constantes y tipos de datos usados habitualmente por el API de Windows.
Si viene al caso, también te pondré un link al artículo en el que se utiliza dicha API, para que tengas un ejemplo práctico y "realista" de cómo usarla, ya que aquí simplemente te mostraré la forma de declarar la función, constante o tipo de datos, sin ningún ejemplo de cómo usarla.
En el caso de que no exista un artículo publicado que la utilice, procuraré añadir un link a una página con un ejemplo "práctico" para usar la función del API y, si es posible o viene al caso, también te indicaré la clase de .NET que podemos usar para realizar la misma tarea.En cada función del API de Windows he incluido la definición de la misma que aparece en la documentación del SDK de Windows, así como las declaraciones para VB6, VB .NET y C#.
Estas son las declaraciones de funciones del API de Windows equivalentes para Visual Basic .NET y C# (y la misma declaración para Visual Basic 6.0 -clásico-).
- Equivalencias en los tipos de datos del API de Windows
- EnumChildWindows
- EnumChildWindowsProc (delegado)
- EnumWindows
- EnumWindowsProc (delegado)
- ExtractIcon
- ExtractIconEx
- FindWindow
- GetActiveWindow
- GetClassLong
- GetClassWord
- GetDriveType (*)
- GetForegroundWindow
- GetLogicalDrives (*)
- GetVersion
- GetVersionEx
- GetLongPathName
- GetShortPathName
- GetWindowText
- IsWindowVisible
- MoveWindow
- OSVERSIONINFO (tipo)
- SendMessage
- SetForegroundWindow
- SetParent
- SetWindowPos
- SetWindowText
- ShowWindow
En la nueva página/sección hay más funciones y tipos del API de Windows y la forma de usarlo.
Nota:
En las declaraciones aquí mostradas, salvo descuido, he usado la forma "recomendada" de .NET, es decir: aplicando el atributo DllImport, (definido en System.Runtime.InteropServices) en caso de que usemos la forma "clásica" de VB6, el compilador de VB creará una declaración "parecida" a la de DllImport, pero usando los valores predeterminados.
A continuación te muestro la forma de usar el atributo DllImport y los campos que puedes indicar. En su versión simple, funciona de la siguiente forma (según los parámetros usados):DllImport(String) Se indica el nombre de la Librería de Windows que contiene la función, esta es la forma "recomendable" de usar este atributo si queremos usar lo valores predeterminados del resto de campos.
DllImport(String, EntryPoint := String) Se indica el nombre de la librería en el primer parámetro, en el segundo se indicará el nombre de la función tal y como está definida en el fichero de cabecera (.H) correspondiente.
Habitualmente existen dos nombres de para cada función del API, una acabada con W y otra acabada con A, según se utilice un sistema operativo Unicode (Windows NT/2000/XP/2003/CE) o no (Win95/98/ME). Ver más abajo la descripción de CharSet, EntryPoint y ExactSpelling.
Los otros parámetros de este atributo, que podemos indicar (usando la forma: nombre_campo := valor en VB o nombre_campo = valor en C#) son:
- CharSet:
El tipo de juego de caracteres a usar.
Puede ser:
--Auto, se elegirá el juego de caracteres adecuado según el sistema operativo.
--Ansi para sistemas Windows 98 / ME o
--Unicode para sistemas Windows NT / 2000/ XP / 2003 / CE
El valor predeterminado es Auto, por tanto si no se indica ningún valor especial en EntryPoint, se elegirá la función que mejor se adecue al sistema operativo.
- EntryPoint:
El valor del campo EntryPoint indica el nombre "exacto" de la función del API que queremos usar.
Si el nombre de la función del API tiene el mismo nombre que el usado en la declaración, no es necesario indicar este valor.
Como he indicado antes, ese nombre puede acabar con A o W, según el tipo de función a usar: ANSI o UNICODE respectivamente.
Si no indicamos en EntryPoint el nombre de la función, se usará la que "coincida" con el nombre de la función indicada en la declaración y según el valor asignado al campo CharSet (o ExactSpelling) se añadirá la letra A o W (si es que existen dos versiones diferentes).
Si no se indica ningún valor específico en CharSet, (el valor realmente será Auto), se usará la versión ANSI (acabada en A) o UNICODE (acabada en W) según el sistema operativo en el que se esté ejecutando la aplicación.
- ExactSpelling:
Indica si el nombre de la función se ha escrito de la misma forma que en la librería del API. Esto es para cuando no se usa EntryPoint, ya que en caso de que el valor de este campo sea False, se añadirá una A al nombre de la función si CharSet es Ansi y una W si el valor de Charset es Unicode.
El valor predeterminado para C# es false.
El valor predeterminado para VB dependerá del valor de CharSet, para Ansi y Unicode es True, para Auto es False.
- SetLastError:
Ver la documentación en línea para más información.
El valor predeterminado para VB y C# es False.
Si en VB utilizamos Declare en lugar de DllImport para declarar la función, el valor de SetLastError es True.
- PreserveSig:
Ver la documentación en línea para más información.
El valor predeterminado es True.
- CallingConvention:
Ver la documentación en línea para más información.
El valor predeterminado es WinAPI que se convertirá en una llamada StdCall para plataformas Windows o en Cdecl para CE.
- BestFitMapping:
Ver la documentación en línea para más información.
El valor predeterminado es True.
Si quieres ver las declaraciones para .NET de muchas de las funciones del API de Windows, no debes dejar de visitar este sitio: PINVOKE.NET.
Equivalencias en los tipos de datos
Los tipos de datos equivalentes entre el API de Windows y los tipos de .NET, los podríamos resumir según la siguiente tabla, en la que se muestran también los de VB6.
Nota:
Debido a que prácticamente todos los tipos del API, salvo excepciones, se corresponden con un entero de .NET (Int32), para que la tabla no sea demasiado monótona, de los tipos de .NET sólo mostraré los tipos definidos en el CTS (Common Type System), sistema de tipos comunes de .NET, es decir los tipos de datos del propio .NET Framework, ya que no creo que te resulte difícil saber a que tipo de VB o C# equivale.Como podrás comprobar, básicamente con saber que el tipo Int32 (Integer en VB, int en C#) de .NET equivale a un LONG del API de Windows, tendríamos más que suficiente, ya que ese es el tipo de datos (incluso camuflado) es el que se suele usar en las librerías del API que están escritas en C "normal".
También comprobarás que .NET dispone de "tipos" para lo que en el API de Windows se soluciona con "apaños de andar por casa", tal es el caso de los punteros de C, que en .NET se solucionan mediante delegados.
Algunos tipos, como el UINT se podrían cambiar por el "específico", pero también funcionará si se cambia por un Int32. El caso de HWND que es el "handle" de una ventana, se puede cambiar indistintamente por un Int32 o preferiblemente por System.IntPtr.
Tipo del API Descripción .NET VB6 HWND Handle de la ventana de destino Int32
System.IntPtr (4)Long UINT Int32 Long WPARAM Cuando se usa en Send/PeekMessage, el primer mensaje a enviar a la ventana Int32 Long LPARAM El segundo mensaje a enviar a la ventana Int32 Long DWORD Int32 Long BOOL Boolean Long/Boolean HRESULT Int32 Long LPCTSTR Dirección de una cadena (no modificable) String o StringBuilder (2) ByVal String LPTSTR Dirección de una cadena (modificable) String o StringBuilder (2) ByVal String LPMSG Puntero a una estructura del tipo MSG (1) -- LPDEVMODE Puntero a una estructura del tipo DEVMODE (1) -- WNDENUMPROC Puntero a una función CallBack (3) Llamada a una función definida por un delegado Long (AddressOf) CALLBACK Definición de la función CallBack (3) Definición de un delegado --
- Los punteros a estructuras normalmente se definen usando la estructura como parámetro por referencia (ByRef en VB, ref en C#)
- Cuando enviamos cadenas al API de Windows, es preferible indicar un tipo StringBuilder ya que de esta forma evitamos la recreación de una nueva cadena, que es lo que ocurriría si usamos un tipo de datos String.
- Las funciones CallBack son punteros a otras funciones, en .NET todo esto se maneja usando delegados (en VB .NET en los punteros a funciones se usará AddressOf para realizar la llamada al delegado).
- Es recomendable que para los manejadores de las ventanas utilices un tipo IntPtr en lugar de un Int32, ya que la propiedad Handle de los controles de Windows.Forms es del tipo IntPtr, y esa propiedad precisamente se puede usar para casi todas las funciones del API de Windows.
.
Esta función del API se utiliza para muchísimas cosas diferentes y dependiendo del uso, puede que los parámetros empleados sean de diferentes tipos, pero gracias a que los lenguajes de .NET permiten la sobrecarga de funciones, podremos usar el mismo nombre de función sin necesidad de que importe de que tipos son dichos parámetros.
Sin embargo en VB6 al no permitir el mismo nombre de función, en ocasiones teníamos que definirla usando nombres diferentes para usos diferentes, esa es la razón principal de que los dos últimos parámetros de esta función se definieran con As Any, que es la declaración que con más frecuencia se utiliza en VB6, pero que en otros casos se puede utilizar con parámetros diferentes, según el uso que le fuésemos a dar.Ejemplo (usando una estructura como último parámetro)
Declaración en el API de Windows:
LRESULT SendMessage( HWND hWnd, // handle of destination window UINT Msg, // message to send WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );
VB6 genérico:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByRef lParam As Any) As LongSi queremos indicar un valor de tipo Long en el último parámetro (para que se "iguale" la declaración con las dos de .NET, habría que declararla de esta forma:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongSi en el último parámetro queremos usar un String y queremos usarlo al mismo tiempo que la anterior:
Private Declare Function SendMessageStr Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As String) As Long
VB .NET:
<System.Runtime.InteropServices.DllImport("user32.DLL")> _ Private Shared Function SendMessage( _ ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _ ByVal wParam As Integer, ByVal lParam As Integer _ ) As Integer End SubSi queremos usar un String en el último parámetro y queremos usarla al mismo tiempo que la anterior, sólo hay que declararla nuevamente con los parámetros diferentes, (sin necesidad de cambiar el nombre, tal como se hace en VB6):
<System.Runtime.InteropServices.DllImport("user32.DLL")> _ Private Shared Function SendMessage( _ ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _ ByVal wParam As Integer, ByVal lParam As String _ ) As Integer End Sub
C#:
[System.Runtime.InteropServices.DllImport("user32.DLL")] private extern static int SendMessage( System.IntPtr hWnd, int wMsg, int wParam, int lParam);[System.Runtime.InteropServices.DllImport("user32.DLL")] private extern static int SendMessage( System.IntPtr hWnd, int wMsg, int wParam, string lParam);
Esta función la podemos usar para convertir un nombre corto (tipo MS-DOS 8.3) en uno largo.
Declaración en el API de Windows:
DWORD GetLongPathName( LPCTSTR lpszShortPath, // Pointer to a null-terminated path to be converted LPTSTR lpszLongPath, // Pointer to the buffer to receive the long path. // You can use the same buffer you used for the lpszShortPath parameter DWORD cchBuffer // Specifies the size of the buffer, in characters );
Declaración para VB6:
Private Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameA" _ (ByVal lpszShortPath As String, _ ByVal lpszLongPath As String, _ ByVal cchBuffer As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("kernel32.dll")> _ Private Shared Function GetLongPathName( _ ByVal lpszShortPath As String, _ ByVal lpszLongPath As System.Text.StringBuilder, _ ByVal cchBuffer As Integer) As Integer End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("kernel32.dll")] private extern static int GetLongPathName( string lpszShortPath, System.Text.StringBuilder lpszLongPath, int cchBuffer);
Esta función la podemos usar para convertir un nombre largo en uno corto (tipo MS-DOS 8.3).
Declaración en el API de Windows:
DWORD GetShortPathName( LPCTSTR lpszLongPath, // pointer to a null-terminated path string LPTSTR lpszShortPath, // pointer to a buffer to receive the // null-terminated short form of the path DWORD cchBuffer // specifies the size of the buffer pointed // to by lpszShortPath );
Declaración para VB6:
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _ (ByVal lpszLongPath As String, _ ByVal lpszShortPath As String, _ ByVal cchBuffer As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("kernel32.dll")> _ Private Shared Function GetShortPathName( _ ByVal lpszLongPath As String, _ ByVal lpszShortPath As System.Text.StringBuilder, _ ByVal cchBuffer As Integer) As Integer End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("kernel32.dll")] private extern static int GetShortPathName( string lpszLongPath, System.Text.StringBuilder lpszShortPath, int cchBuffer);
Trae la ventana indicada al frente y la activa.
Si se pudo traer al frente, devolverá un valor Verdadero (<>0 en VB6).
En ocasiones podríamos sustituir esta función del API usando el método BringToFront que todos los controles (y/o clases derivadas de Control) tienen.Declaración en el API de Windows:
BOOL SetForegroundWindow( HWND hWnd // handle to window to bring to foreground );
Declaración para VB6:
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Public Shared Function SetForegroundWindow(ByVal hWnd As System.IntPtr) As Boolean End Function
Declaración para C#:
{System.Runtime.InteropServices.DllImport("user32.dll")] public extern static bool SetForegroundWindow(System.IntPtr hWnd);
Devuelve el "handle" de la ventana que coincida con la clase y nombre indicados.
Normalmente el primer parámetro se puede omitir.Ejemplos: VB6, .NET (VB y C#)
Declaración en el API de Windows:
HWND FindWindow( LPCTSTR lpClassName, // pointer to class name LPCTSTR lpWindowName // pointer to window name );
Declaración para VB6:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As System.IntPtr End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static System.IntPtr FindWindow( string lpClassName, string lpWindowName);
Muestra (cambia) la ventana actual al estado indicado.
Si la ventana ya estaba visible devuelve un valor distinto de cero.
El estado puede ser: maximizada, minimizada, etc.
En .NET sería el equivalente a asignar un valor a la propiedad WindowState de un formulario.
Declaración en el API de Windows:
BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window );
Declaración para VB6:
Private Declare Function ShowWindow Lib "user32" _ (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function ShowWindow( _ ByVal hWnd As System.IntPtr, _ ByVal nCmdShow As Integer) As Integer End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static int ShowWindow( System.IntPtr hWnd, int nCmdShow);
Utilizada para saber si una ventana está visible.
Declaración en el API de Windows:
BOOL IsWindowVisible( HWND hWnd // handle to window );
Declaración para VB6:
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Public Shared Function IsWindowVisible(ByVal hWnd As System.IntPtr) As Boolean End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] public extern static bool IsWindowVisible(System.IntPtr hWnd);
Recupera el texto de la barra de títulos de una ventana o el texto de un control.
Devuelve el número de caracteres copiados en el segundo parámetro o cero si la ventana o el control no tienen texto que copiar.Ejemplos:
Con EnumWindows,
con GetForegroundWindow
Declaración en el API de Windows:
int GetWindowText( HWND hWnd, // handle to window or control with text LPTSTR lpString, // address of buffer for text int nMaxCount // maximum number of characters to copy );
Declaración para VB6:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function GetWindowText( _ ByVal hWnd As System.IntPtr, _ ByVal lpString As System.Text.StringBuilder, _ ByVal cch As Integer) As Integer End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static int GetWindowText( System.IntPtr hWnd, System.Text.StringBuilder lpString, int cch);
Cambia el texto de la barra de títulos de una ventana o el texto de un control.
Devuelve un valor verdadero (distinto de cero) si todo funcionó bien.
Declaración en el API de Windows:
BOOL SetWindowText( HWND hWnd, // handle to window or control LPCTSTR lpString // address of string );
Declaración para VB6:
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" _ (ByVal hWnd As Long, ByVal lpString As String) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function SetWindowText( _ ByVal hWnd As System.IntPtr, _ ByVal lpString As String) As Boolean End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static bool SetWindowText( System.IntPtr hWnd, string lpString);
Se usa para iniciar la enumeración de ventanas de "mayor" nivel (top level).
En el primer parámetro se indicará un "puntero a una función", (ver EnumWindowsProc), que en .NET se declara como un delegado.
Declaración en el API de Windows:
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value );Declaración para VB6:
Private Declare Function EnumWindows Lib "user32" _ (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function EnumWindows( _ ByVal lpfn As EnumWindowsDelegate, _ ByVal lParam As Integer) As Boolean End FunctionPrivate Delegate Function EnumWindowsDelegate _ (ByVal hWnd As System.IntPtr, ByVal parametro As Integer) As Boolean
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static bool EnumWindows(EnumWindowsDelegate lpfn, int lParam);
private delegate bool EnumWindowsDelegate (System.IntPtr hWnd, int parametro);
Enumera las "ventanas" de una ventana "top-level". Es decir las ventanas pertenecientes a una ventana, por ejemplo los controles que contiene una ventana... hay que recordar que para Windows todo lo que se muestra es una ventana (o casi).
En el segundo parámetro se indicará un "puntero a una función", (ver EnumChildProc), que en .NET se declara como un delegado.
Declaración en el API de Windows:
BOOL EnumChildWindows( HWND hWndParent, // handle to parent window WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value );
Declaración para VB6:
Private Declare Function EnumChildWindows Lib "user32" _ (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function EnumChildWindows _ (ByVal hWndParent As System.IntPtr, _ ByVal lpEnumFunc As EnumWindowsDelegate, _ ByVal lParam As Integer) As Integer End Function
Private Delegate Function EnumWindowsDelegate _ (ByVal hWnd As System.IntPtr, ByVal parametro As Integer) As Boolean
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static int EnumChildWindows( System.IntPtr hWndParent, EnumWindowsDelegate lpEnumFunc, int lParam);
private delegate bool EnumWindowsDelegate (System.IntPtr hWnd, int parametro);
EnumWindowsProc, EnumChildProc
Estas funciones son funciones callback, es decir "un puntero a una función". Realmente no es que se use para "crear" ventanas "callback", sino que es la "definición" de cómo debe ser la función callback usada con las dos primeras funciones. Sería el equivalente a un delegado de .NET.
Para usar estos delegados habría que usar las funciones EnumWindows o EnumChildWindows de la siguiente forma, suponiendo que tenemos un método con la misma firma del delegado llamado EnumWindowsProc:
En VB .NET:
EnumWindows(AddressOf EnumWindowsProc, 0) EnumChildWindows(handleParent, AddressOf EnumWindowsProc, 0)
En C#:
EnumWindows(new EnumWindowsDelegate(EnumWindowsProc), 0) EnumChildWindows(handleParent, new EnumWindowsDelegate(EnumWindowsProc), 0)
Declaración en el API de Windows:
BOOL CALLBACK EnumWindowsProc( HWND hwnd, // handle to parent window LPARAM lParam // application-defined value );BOOL CALLBACK EnumChildProc( HWND hwnd, // handle to child window LPARAM lParam // application-defined value );
Declaración para VB6:
La función "callback" se debería declarar (en un módulo BAS) como:
Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal parametro As Long) As Long '... End Function
Declaración para VB .NET:
Private Delegate Function EnumWindowsDelegate _ (ByVal hWnd As System.IntPtr, ByVal parametro As Integer) As Boolean
Declaración para C#:
private delegate bool EnumWindowsDelegate (System.IntPtr hWnd, int parametro);
ExtractIcon y ExtractIconEx
Extraer iconos de una aplicación o fichero (.exe, .dll,. etc.)
Ejemplos: .NET (VB y C#) y VB6
Declaración en el API de Windows:
.
Declaración para VB6:
Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" _ (ByVal hInst As Long, ByVal lpszExeFileName As String, _ ByVal nIconIndex As Long) As Long
Declaración para VB .NET:
' Declaraciones para extraer iconos de los programas <DllImport("shell32.dll")> _ Private Shared Function ExtractIconEx( _ ByVal lpszFile As String, ByVal nIconIndex As Integer, _ ByRef phiconLarge As Integer, ByRef phiconSmall As Integer, _ ByVal nIcons As UInteger) As Integer End Function <DllImport("shell32.dll")> _ Private Shared Function ExtractIcon( _ ByVal hInst As Integer, ByVal lpszExeFileName As String, _ ByVal nIconIndex As Integer) As IntPtr End Function
Declaración para C#:
[DllImport("shell32.dll")] private extern static int ExtractIconEx(string lpszFile, int nIconIndex, ref int phiconLarge, ref int phiconSmall, uint nIcons); [DllImport("shell32.dll")] private extern static IntPtr ExtractIcon(int hInst, string lpszExeFileName, int nIconIndex);
GetClassLong
Devuelve un valor de 32 bits (long) de la ventana indicada por el handle del primer parámetro.
Ejemplo para .NET (VB y C#)
Declaración en el API de Windows:
DWORD GetClassLong( HWND hWnd, int nIndex );
Declaración para VB6:
.
Declaración para VB .NET:
<DllImport("user32.dll")> _ Private Shared Function GetClassLong( _ ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer End Function
Declaración para C#:
[DllImport("user32.dll")] private extern static int GetClassLong(IntPtr hWnd, int nIndex);
Esta función devuelve el Handle de la venta que está actualmente activa, (la que el usuario está usando en ese momento).
GetForegroundWindow no es lo mismo que GetActiveWindow, ya que esta última devuelve la relacionada con el mismo thread (hilo) de la aplicación actual (la nuestra).
Declaración en el API de Windows:
HWND GetForegroundWindow(VOID);
Declaración para VB6:
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function GetForegroundWindow() As System.IntPtr End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static System.IntPtr GetForegroundWindow();
GetActiveWindow devuelve el Handle de la venta activa de nuestra aplicación, sería el equivalente a ActiveForm de VB6.
Si quieres averiguar cual es la ventana que actualmente está activa (no necesariamente de nuestra aplicación), puedes usar GetForegroundWindow.
Declaración en el API de Windows:
HWND GetActiveWindow(VOID);
Declaración para VB6:
Private Declare Function GetActiveWindow Lib "user32" () As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function GetActiveWindow() As System.IntPtr End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private extern static System.IntPtr GetActiveWindow();
GetVersion
Ejemplo para Visual Basic 6.0, ejemplo para Visual Basic .NET y C#
Devuelve la versión actual del sistema operativo.
Declaración en el API de Windows:
DWORD GetVersion(void);
Declaración para VB6:
Private Declare Function GetVersion Lib "kernel32" () As Long
Declaración para VB .NET:
<DllImport("kernel32.dll")> _ Public Function GetVersion() As Integer End Function
Declaración para C#:
[DllImport("kernel32.dll")] static extern public int GetVersion();
GetVersionEx
Nota:
En los ejemplos anteriores se explica cómo usar la función y se muestra el código de la declaración, tanto de la función como de los tipos usados para obtener la información.Breve descripción.
Declaración en el API de Windows:
.
Declaración para VB6:
.
Declaración para VB .NET:
.
Declaración para C#:
.
OSVERSIONINFO y OSVERSIONINFOEX
Nota:
En los ejemplos anteriores se explica cómo usar la función y se muestra el código de la declaración, tanto de la función como de los tipos usados para obtener la información.
Breve descripción.
Declaración en el API de Windows:
.
Declaración para VB6:
.
Declaración para VB .NET:
.
Declaración para C#:
.
Esta función la usaremos para cambiar el tamaño y la posición de una ventana de la que conocemos el handle.
Si esa ventana está contenida en otra, la posición será relativa a la ventana que la contiene, no al escritorio.
Ejemplos: VB6, .NET (VB y C#)
Declaración en el API de Windows:
BOOL MoveWindow( HWND hWnd, // handle to window int X, // horizontal position int Y, // vertical position int nWidth, // width int nHeight, // height BOOL bRepaint // repaint flag );
Declaración para VB6:
Private Declare Function MoveWindow Lib "user32" _ (ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _ ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Function MoveWindow(ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _ ByVal nWidth As Integer, ByVal nHeight As Integer, _ ByVal bRepaint As Integer) As Integer End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] public static int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, int bRepaint);
Asigna a una ventana el padre o contenedor.
Ejemplos: VB6, .NET (VB y C#)
Declaración en el API de Windows:
HWND SetParent( HWND hWndChild, // handle to window whose parent is changing HWND hWndNewParent // handle to new parent window );
Declaración para VB6:
Private Declare Function SetParent Lib "user32" _ (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Declaración para VB .NET:
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr End Function
Declaración para C#:
[System.Runtime.InteropServices.DllImport("user32.dll")] private IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
SetWindowPos
Esta función sirve para cambiar el tamaño y posición de una ventana (la indicada por el handle del primer parámetro), pero también se usa para poner esa venta encima (o debajo) del resto de ventanas.
Ejemplos: .NET (VB y C#) (para poner siempre encima) y VB6
Declaración en el API de Windows:
BOOL SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags );
Declaración para VB6:
Private Declare Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cX As Long, ByVal cY As Long, _ ByVal wFlags As Long) As Long
Declaración para VB .NET:
La declaración se puede hacer como Sub (void en C#) o como Function, devolviendo un Integer o un Boolean, pero normalmente no se utiliza el valor devuelto.
<DllImport("user32.DLL")> _ Private Shared Sub SetWindowPos( _ ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, _ ByVal X As Integer, ByVal Y As Integer, _ ByVal cx As Integer, ByVal cy As Integer, _ ByVal wFlags As Integer) End Sub
Declaración para C#:
[DllImport("user32.DLL", EntryPoint="SetWindowPos")] static extern bool SetWindowPos( int hWnd, // handle to window int hWndInsertAfter, // placement-order handle int X, // horizontal position int Y, // vertical position int cx, // width int cy, // height uint uFlags // window-positioning options );
GetLogicalDrives
The GetLogicalDrives function retrieves a bitmask representing the currently available disk drives.
Que más o menos quieres decir que devuelve una máscara de bits con los discos disponibles.Nota:
Existe un método con el mismo nombre definido en la clase Environment que sirve para casi lo mismo, bueno, en realidad es parecido a la función del API GetLogicalDriveStrings.
Ejemplos:
Declaración en el API de Windows:
DWORD GetLogicalDrives(void);
Declaración para VB6:
Private Declare Function GetLogicalDrives Lib "kernel32" () As Long
Declaración para VB .NET:
<DllImport("kernel32.dll")> _ Private Function GetLogicalDrives() As Integer End Function
Declaración para C#:
[DllImport("kernel32.dll")] private extern static int GetLogicalDrives();
GetDriveType
The GetDriveType function determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.
Pues eso, que esta función nos indica el tipo de disco.Nota:
El valor devuelto por esta función usa los valores de las enumeración indicada en el ejemplo de VB.NET y C#.
Si quieres más detalle sobre los tipos de discos USB, busca info sobre SetupDiGetDeviceRegistryProperty (yo aún no lo he probado, si lo hago, pues te lo pondré por esta página o sección)
Ejemplos:
Declaración en el API de Windows:
UINT GetDriveType( LPCTSTR lpRootPathName );
Declaración para VB6:
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" _ (ByVal nDrive As String) As Long
Declaración para VB .NET:
<DllImport("kernel32.dll")> _ Private Function GetDriveType(ByVal nDrive As String) As TipoUnidades End Function
La declaración de la enumeración TipoUnidades:
Enum TipoUnidades As Integer ' Indico también los valores del API (empiezan por cero y van de uno en uno) Desconocido ' 0 DRIVE_UNKNOWN The drive type cannot be determined. No_montado ' 1 DRIVE_NO_ROOT_DIR The root path is invalid; ' for example, there is no volume mounted at the path. Extraible ' 2 DRIVE_REMOVABLE The drive has removable media; ' for example, a floppy drive or flash card reader. ' Las llaves USB los da como extraibles. Fijo ' 3 DRIVE_FIXED The drive has fixed media; ' for example, a hard drive, flash drive, or thumb drive. ' Los discos duros normales enchufados por USB son fijos. Remoto ' 4 DRIVE_REMOTE The drive is a remote (network) drive. CDROM ' 5 DRIVE_CDROM The drive is a CD-ROM drive. RAMDISK ' 6 DRIVE_RAMDISK The drive is a RAM disk. End Enum
Declaración para C#:
[DllImport("kernel32.dll")] private extern static TipoUnidades GetDriveType(string nDrive);
La declaración de la enumeración TipoUnidades:
enum TipoUnidades : int { // Indico también los valores del API (empiezan por cero y van de uno en uno) Desconocido, // 0 DRIVE_UNKNOWN The drive type cannot be determined. No_montado, // 1 DRIVE_NO_ROOT_DIR The root path is invalid; // for example, there is no volume mounted at the path. Extraible, // 2 DRIVE_REMOVABLE The drive has removable media; // for example, a floppy drive or flash card reader. // Las llaves USB los da como extraibles. Fijo, // 3 DRIVE_FIXED The drive has fixed media; // for example, a hard drive, flash drive, or thumb drive. // Los discos duros normales enchufados por USB son fijos. Remoto, // 4 DRIVE_REMOTE The drive is a remote (network) drive. CDROM, // 5 DRIVE_CDROM The drive is a CD-ROM drive. RAMDISK, // 6 DRIVE_RAMDISK The drive is a RAM disk. };