Viernes 15 de Noviembre de 2024, 10:44
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problemilla Con Keyboard Hook
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problemilla Con Keyboard Hook (Leído 1237 veces)
tonilope
Miembro activo
Mensajes: 51
Problemilla Con Keyboard Hook
«
en:
Lunes 23 de Octubre de 2006, 01:23 »
0
Hola. He escrito este pequeño programa para poder controlar el WinAmp mientras estoy en otras aplicaciones. Funciona de lujo, salvo cuando estoy en el Mozilla. El problema es que cada pulsación de teclado el Mozilla lo intepreta como dos pulsaciones seguidas, lo que hace que mi programa funcione mal (salta las canciones de dos en dos, por ejemplo). Como sólo me pasa con esta aplicación, imagino que no será culpa mia, pero me gustaría corregirlo de alguna manera (leer el título de la ventana activa y contrastarlo con una lista negra NO me sirve ya que no conozco todas las aplicaciones afectadas con ese "fallo").
Os pongo el código fuente del programa (
YA ARREGLADO
):
lib_hook.c
Código: Text
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "dll.h"
typedef union {
struct {
unsigned int repeticion:16;
unsigned int scan:8;
unsigned int extendida:1;
unsigned int reservado:4;
unsigned int contexto:1;
unsigned int previo:1;
unsigned int transicion:1;
};
unsigned int lParam;
}keyData;
static HHOOK hookteclado;
static HINSTANCE hInstance;
DLLIMPORT LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
int tecla=(int)wParam;
keyData info_tecla;
info_tecla.lParam=lParam;
if(code>=0 && code!=HC_NOREMOVE)
{
//CTRL + ALT + 'hot key'
if(info_tecla.transicion==0 && info_tecla.contexto==1 && HIBYTE(GetKeyState(VK_CONTROL)))
SendMessage(FindWindowEx(NULL, NULL, "Winamp v1.x", NULL), WM_KEYDOWN, tecla, 0);
}
return CallNextHookEx(NULL, code, wParam, lParam);
}
DLLIMPORT void activa_hook()
{
hookteclado = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);
}
DLLIMPORT void desactiva_hook()
{
UnhookWindowsHookEx(hookteclado);
}
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
hInstance=hInst;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
hInstance=hInst;
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
dll.h
Código: Text
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
DLLIMPORT void desactiva_hook(void);
DLLIMPORT void activa_hook(void);
#endif
controlador_winamp.c
Código: Text
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
HINSTANCE hinstDLL;
FARPROC activa_hook;
FARPROC desactiva_hook;
printf("\n\tWinAmp [Background] Controlator 0.1 (by tonilope)\n\n");
printf("\n\nLista de Hot-Keys mas utilizadas: (CTRL + ALT + HOTKEY)\n");
printf("\n\n[Z]: Previa");
printf("\n\n[X]: Play");
printf("\n\n[C]: Pausa/Reanudar");
printf("\n\n[V]: Stop");
printf("\n\n[B]: Siguiente");
printf("\n\n[2](Bloq. num): Bajar volumen");
printf("\n\n[8](Bloq. Num): Subir volumen");
if((hinstDLL=LoadLibrary("lib_hook.dll"))!=NULL)
{
activa_hook=(FARPROC)GetProcAddress(hinstDLL, "activa_hook");
desactiva_hook=(FARPROC)GetProcAddress(hinstDLL, "desactiva_hook");
if(activa_hook!=NULL && desactiva_hook!=NULL)
{
printf("\n\n\tActivando hook del teclado...");
activa_hook();
printf("\tOK");
printf("\n\n\t\t(Pulsa 'D' para desactivarlo)");
while(toupper(getch())!='D');
printf("\n\n\tDesactivando hook del teclado...");
desactiva_hook();
printf("\tOK");
FreeLibrary(hinstDLL);
}
}
else
printf("\n\n\tERROR: NO se encuentra lib_hook.dll");
printf("\n\n\t\tPulsa una tecla para cerrar...");
getch();
return 0;
}
Salu2
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problemilla Con Keyboard Hook
«
Respuesta #1 en:
Lunes 23 de Octubre de 2006, 10:13 »
0
Primero la parte mala, tuve que hacer esto:
Código: Text
//#include "dll.h"
#define DLLIMPORT __declspec(dllexport)
Y me costo entender un poco como funcionaba la cosa ...
Segundo la parte buena, en cuanto lo tuve funcionando y mire la documentacion de KeyboardProc acerte el problema en el primer intento.
Mira atentamente el parametro code, estas tomando en cuenta solo una parte
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
tonilope
Miembro activo
Mensajes: 51
Re: Problemilla Con Keyboard Hook
«
Respuesta #2 en:
Lunes 23 de Octubre de 2006, 11:16 »
0
... HC_NOREMOVE
¡Pues claro! Qué despiste más tonto... GRACIAS.
Salu2
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problemilla Con Keyboard Hook
«
Respuesta #3 en:
Lunes 23 de Octubre de 2006, 11:27 »
0
Cita de: "tonilope"
... HC_NOREMOVE
¡Pues claro! Qué despiste más tonto... GRACIAS.
Salu2
Efestivamente HC_NOREMOVE era lo que faltaba
De nadas
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problemilla Con Keyboard Hook