dreamermx Lt JG

Registrado: 14 Oct 2004Mensajes: 57Ubicación: Acapulco Guerrero Mexico
|
Publicado: Jue 20 Abr, 2006 11:21 pm Asunto: Leyendo ratones con WM_INPUT |
|
|
Hola amigos
Estoy haciendo un programa, que me me permite leer mediante WM_INPUT, modo Raw MoUSE la informacion de varios ratones, en este caso, son 3: 1 ps/2 y 2 usb. enseguida proporciono, la direccion para descargar el programa que hago mención.
http://mx.geocities.com/mverastegui/descarga/ratonvcl.zip
El inconveniente es que cuando pones, un boton, o controles que hacen uso de la entrada de datos a traves del teclado, cajas de texto, Listas, memos etc, el programa, no funciona, pero si estos estan deshabilitados funciona correctamente.
Lo que hago, es capturar el evento, WM_INPUT, y asi detectar que raton se esta usando, claro, en pantalla siempre se ve el cursor del mouse, pero, en la aplicacion yo leo las posiciones de los ratones (posiciones relativas) que estan conectados.
| Código: |
int TForm1::HandleWMInput(HWND hwnd, HRAWINPUT hRawInput)
{
RAWINPUT *raw;
UINT dwSize;
RAWMOUSE *mouse_data;
AnsiString cad;
rid.GetRawInputData_f(hRawInput, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
if(dwSize >= rid.data_buf_size)
{
void *lpb;
lpb = realloc(rid.data_buf, dwSize);
if(!lpb)
return 0;
rid.data_buf = lpb;
rid.data_buf_size = dwSize;
}
if(rid.GetRawInputData_f(hRawInput, RID_INPUT, rid.data_buf, &dwSize,
sizeof(RAWINPUTHEADER)) != dwSize)
{
printf("GetRawInputData doesn't return correct size!\n");
assert(0);
return 0;
}
raw = (RAWINPUT *)rid.data_buf;
if (raw->header.dwType == RIM_TYPEMOUSE)
{
int i;
int mouse = -1;
for(i = 0; i < rid.num_mice; ++i)
{
if (raw->header.hDevice == rid.Amouse[i])
{
mouse = i;
break;
}
}
mouse_data = &raw->data.mouse;
Label1->Caption = "Hola";
cad.sprintf("Mouse: num %d, usFlags=%04x ulButtons=%04x usButtonFlags=%04x "
"usButtonData=%04x ulRawButtons=%04x lLastX=%04x lLastY=%04x "
"ulExtraInformation=%04x\r\n",
mouse,
mouse_data->usFlags,
mouse_data->ulButtons,
mouse_data->usButtonFlags,
mouse_data->usButtonData,
mouse_data->ulRawButtons,
mouse_data->lLastX,
mouse_data->lLastY,
mouse_data->ulExtraInformation);
Archivo << cad.c_str();
Memo1->Lines->Add(cad);
pintar(mouse,mouse_data->lLastX,mouse_data->lLastY);
// Memo1->Lines->Add(cad);
}
return 1;
} |
El extracto de la definicion la funcion que maneja el evento WM_INPUT esta en principal.h
| Código: |
...
protected:
...
int HandleWMInput(HWND hwnd, HRAWINPUT hRawInput);
...
public: // User declarations
void raw_input_deinit();
int raw_input_init();
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_INPUT, TMessage, ManejaWMInput)
END_MESSAGE_MAP(TObject)
...
|
Inicialmente, el manejador del mensaje estaba asignado a TForm, pero pense que si se asignaba a TObject abarcaria a todos los componentes pero realiza lo mismo.
El objetivo es: a partir de que se ejecute la aplicacion, pueda yo estar leyendo la informacion que proporcione un raton especifico (por ejemplo el segundo raton usb), este minimizada la aplicacion o este corriendo en 2do plano.
Esta adaptacion la tome de un programa ejemplo que proporciona el foro
IndieGamer, con el tema Mouse Party.
Direccion del foro.
http://forums.indiegamer.com/index.php
y la direccion para descargar el programa de demostracion, con codigo fuente es:
http://www.bigkahunareef.com/downloads/2micesample.zip
¿Alguna sugerencia?
Muchas gracias. _________________ Miguel Angel Verastegui Diaz |
|