SendMessage
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.
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 Long
Si 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 Long
Si 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 Sub
Si 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);