Cómo usar enlaces de teclado para pasar variables al programa principal
Autor: GDGF
1. Prefacio
Un día, vi a mi madre practicando mecanografía en la computadora y, a menudo, mirando el teclado, pensé: si el teclado pudiera pronunciarse, le resultaría más fácil desarrollar el buen hábito de. ¿"mecanografía táctil"? Pensando en esto, comencé a hacerlo (no se apresure a obtener la caja de herramientas, ^_^)...
La clave para la pronunciación de las teclas es hacerle saber al programa lo que está presionado actualmente. está en el teclado, por supuesto, a su propio programa no le importa qué tecla se presiona y se reproduce el sonido correspondiente, entonces, ¿cómo puede saber qué tecla está presionada actualmente por otros programas? Usar un gancho de teclado puede resolver este problema muy bien.
Descarga el código fuente completo en tamaño de este artículo: 552K
2. Principios básicos del gancho (HOOK)
Cuando WINDOWS llama a la función de devolución de llamada del gancho. , primero llamará a la función ubicada en La función al comienzo de la cadena, siempre que coloquemos nuestra función de devolución de llamada al comienzo de la cadena de funciones, la función de devolución de llamada se llamará primero. Entonces, ¿cómo ponemos nuestra propia función de devolución de llamada al comienzo de la cadena de funciones? Podemos utilizar la función SetWindowsHookEx() para lograr esta funcionalidad. Primero echemos un vistazo al prototipo de la función SetWindowsHookEx:
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
El primer parámetro: especifique el tipo de enlace, incluidos WH_MOUSE, WH_KEYBOARD y más de diez tipos (consulte MSDN para detalles)
El segundo parámetro: identifica la dirección de entrada de la función de enlace
El tercer parámetro: el identificador del módulo donde se encuentra la función de enlace;
El cuarto parámetro: la ID de función relacionada con el gancho se usa para especificar qué hilo debe enganchar el gancho, o usa 0 para interceptar mensajes de todo el sistema.
Además, es importante tener en cuenta que para capturar todos los eventos, la función de enlace debe colocarse en la DLL.
3. Implementación específica
No diré mucho sobre la teoría. Ejecute VC 6.0, cree un nuevo proyecto MFC AppWizard (dll), asígnele el nombre Hook y use el predeterminado. opciones para crear el tipo DLL, incluso si usa la DLL MFC que tiene ***, haga clic en Finalizar para comenzar a escribir código:
(1) Defina una función global en Hook.h.
Agregue el código que define la variable global Hook bajo #endif en el archivo cpp:
static HHOOK hkb=NULL;
HINSTANCE hins //Maneja al módulo donde se encuentra la función de gancho; se encuentra
(3) Agregar código principal
BOOL installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc, hins, 0);
Devuelve TRUE;
}
El primer parámetro especifica el tipo de gancho, porque solo usamos el teclado, así que configúrelo. a WH_KEYBOARD; El segundo parámetro especifica la dirección de entrada de la función de enlace como KeyboardProc. Esta función se llamará cuando el enlace enlace cualquier mensaje, es decir, cuando haya entrada de teclado en cualquier ventana del sistema, provocará inmediatamente. la acción de KeyboardProc Capítulo 1 Los tres parámetros son el identificador del módulo donde se encuentra la función de enlace; finalmente, el tercer parámetro es el identificador del módulo donde se encuentra la función de enlace;
El tercer parámetro es el identificador del módulo donde se encuentra la función de enlace; el último parámetro es el ID de la función relacionada con el enlace, que se utiliza para especificar qué hilo desea enlazar el enlace. Si es 0, mensajes del. todo el sistema será interceptado;
Ahora, comenzaremos a definir qué hará el programa cuando se presione una tecla en el teclado~
Operación KeyboardProc:
RESULTADO DE LLAMADA KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam )
{
if (((DWORD)lParamamp; 0x40000000) amp; amp; (HC_ACTION== nCode))
{
switch(wParam) //identificador de tecla del teclado
{
case ''1'': sndPlaySound("1. wav", SND_ASYNC); break; //Presione el número Cuando la tecla 1
case '' 2'': sndPlaySound("2.wav", SND_ASYNC); break;
case ''3'': sndPlaySound("3.wav ", SND_ASYNC);
caso ''4'': sndPlaySound("4. wav", SND_ASYNC;
....
case ''A'': sndPlaySound("a.wav", SND_ASYNC //Al presionar la tecla A
case; ''B'': sndPlaySound("b.wav", SND_ASYNC);
caso 'C'': sndPlaySound("c.wav", SND_ASYNC); p> caso 'D'': sndPlaySound("d. wav", SND_ASYNC
....
}
} p>
LRESULT RetVal = CallNextHookEx( hkb, nCode , wParam, lParam
return RetVal
}
En el código anterior, Utilice playSound como operación después de presionar la tecla. wav, se define como "C:\\a.wav"); el segundo parámetro define el modo de reproducción. El modo SND_ASYNC puede liberar el archivo de sonido que se está reproduciendo a tiempo y detener inmediatamente la reproducción del sonido actual para reproducir nuevos sonidos. De esta forma no nos sentiremos bloqueados cuando presionemos teclas continuamente. Para ejecutar la función sndPlaySound, se debe agregar el siguiente contenido al archivo de encabezado de Hook.cpp: #include "mmsystem.h"
Luego haga clic en "Proyecto"-"Configuración" en el menú VC para ingresar a la página de propiedades del enlace.
Luego haga clic en "Proyecto"-"Configuración" en el menú VC, ingrese a la página de propiedades del enlace, ingrese: winmm.lib en L Objetos/Módulos de biblioteca y luego confirme.
(4) Agregar logotipo de salida
Agregar
installhook
KeyboardProc
Solo cuatro pasos, la creación El gancho del teclado se completa y otros programas pueden llamar libremente al archivo DLL compilado.
¿Cómo llamar a DLL en el programa? Es muy sencillo. Luego use VC 6.0 para crear un nuevo proyecto MFC AppWizard (exe), asígnele el nombre KeySound, haga clic en "Aceptar", seleccione el tipo de programa como cuadro de diálogo y haga clic en "Aceptar" directamente.
En la función de inicialización OnInitDialog() CDialog::OnInitDialog() del archivo KeySoundDlg.cpp agregue el siguiente contenido:
/Para evitar que el programa resida repetidamente en la memoria, también es para evitar dos. Se produjo un error mientras el programa estaba leyendo la DLL.
CreateMutex(NULL, FALSE, "KeySound");
if(GetLastError()==ERROR_ALREADY_EXISTS)
OnOK();
/Leyendo DLL
HINSTANCE estático hinstDLL;
typedef BOOL (CALLBACK *inshook)();
inshook instkbhook; if(hinstDLL=LoadLibrary((LPCTSTR) "Hook.dll"))
{
instkbhook=(inshook)GetProcAddress(hinstDLL, "installhook"); p> instkbhook();
}
else
{
MessageBox("Archivo Hook.dll, error en la inicialización del programa") ;
OnOK();
}
Coloque el KeySound.exe y Hook.dll compilados en el mismo directorio, defina el archivo de sonido y ejecute KeySound .exe, luego abre Notepad o WritePad y experimenta el placer de que el sistema lea cada tecla que presionas^-^
Una cosa que debo decir es que el teclado estándar tiene 101 teclas, así que si quieres hacer un sonido para una cierta cantidad de teclas, debe definir la cantidad de teclas que desea usar en la operación KeyboardProc anterior. Las 10 teclas numéricas y las teclas de 26 letras comunes no serán demasiado difíciles siempre que "'A'" corresponda a la tecla A y "'1'" corresponda a la tecla 1. Sin embargo, si desea que haya más teclas, tenga varias For. música especial, puede encontrar algunos problemas de codificación del teclado. Por ejemplo, la tecla ESC no se puede usar simplemente para deshacerse de ella, sino que debe definirse con VK_ESCAPE. Otro ejemplo, la tecla Alt debe definirse con VK_MENU. tabla de codificación del teclado, solo se puede definir cuántas teclas se deben definir en la operación KeyboardProc anterior para que suenen.
Será un dolor de cabeza si no hay una tabla de codificación de teclado en la definición. Aquí presento un método para permitir que el programa le diga los nombres de las teclas del teclado:
Para agregar el mapeo PreTranslateMessage a un proyecto, agregue el. siguiente código:
char KeyName[50];
ZeroMemory(KeyName, 50);
if(pMsg -gt; message == WM_KEYDOWN) p>
{
GetKeyNameText(pMsg-gt; lParam, KeyName, 50
MessageBox( KeyName);
Cuando se muestra la ventana del programa en su Cuando presiona una tecla frente a usted, aparecerá un mensaje que muestra el nombre de la clave y luego lo envuelve con '''', como un punto de coma, es decir, '','' y ''.''. '', mantenlo simple :)
En este punto, se ha completado la escritura del programa de pronunciación de claves. Al cambiar el nombre del archivo de sonido sin cambiar el programa en sí, el propósito de cambiar la clave. Se puede lograr sonido, pero hay un arrepentimiento: la ubicación del archivo de sonido en el disco duro no se puede mover desde la unidad C y el programa no se puede reproducir desde la unidad D. ¿Cómo puedo leer el archivo de sonido de manera flexible? Puede utilizar la función API GetModuleFileName para obtener el directorio donde se encuentra el programa. El método de implementación específico es el siguiente:
(1) Agregue el siguiente contenido en Hook.h public:
BOOL InitInstance(); / /Función de inicialización
(2) Agregue el código para definir variables globales en #endif de Hook.cpp:
char szBuf[256];
char * p;
CString msg;
(3) Agregar:
BOOL CHookApp:.InitInstance ()
{
hins=AfxGetInstanceHandle( );
GetModuleFileName(AfxGetInstanceHandle( ), szBuf, sizeof(szBuf));
p = szBuf; /p>
while( strchr(p,''\\'))
{
p = strchr(p,''\\');
p;
p>
}
*p = ''\0''; >
return TRUE;
}
(4) Crea una nueva carpeta y llámala Sonido;
(5) Cambia la ubicación física de el archivo de sonido está definido
case '' 1'': sndPlaySound(msg "sound\\1.wav", SND_ASYNC
msg es para obtener el directorio actual; Agregar el siguiente código significa que el sonido en el directorio actual se reproduce en el directorio 1.wav, de modo que la ruta absoluta del archivo de sonido se convierte en una ruta relativa flexible. Sólo necesita colocar KeySound.exe, Hook.dll y la carpeta Sound en la misma carpeta, y luego podrá mover los archivos de sonido a cualquier lugar simplemente moviendo toda la carpeta.
Al depurar, tenga en cuenta: el directorio Sonido bajo el directorio de ejecución de Hook.dll y KeySound.exe.
Si recibe un mensaje como símbolo externo sin resolver __imp__sndPlaySoundA@8 al compilar y vincular, agregue Winmm.lib a la configuración de su proyecto.
Últimos comentarios [Publicar un comentario] [Publicar un comentario] Ver todos los comentarios Recomendar a amigos Imprimir esta página
Para resolver el problema de Brother Logo arriba:
Haga clic en "Proyecto \Configuración\ENLACE\Objetos, Bibliotecas, Módulos" Agregar: winmm.lib
Identificación: Por favor ayuda: Mi CORREO ELECTRÓNICO xinlianf@163.com
Plataforma operativa XP, VC 7.0
Problema: se produce el siguiente error al compilar la DLL del enlace del teclado
//////////////////// //// ///////// /////
Enlazando...
Creando biblioteca .\Debug/hodll.lib y objeto .\Debug /hodll.exp
hodll.obj: error LNK2019: No se puede analizar el símbolo externo __imp__sndPlaySoundA@8, que está en la función "long __stdcall KeyboardProc(int, unsigned int. long)" (?KeyboardProc@@ YGJHIJ@Z) se hace referencia en la función
.\Debug/hodll.dll: error fatal LNK1120: 1 comando externo que no se puede analizar
Línea de comando:
Se está creando el archivo temporal "C:\DOCUME~1\wlt\LOCALS~1\Temp\RSP000031.rsp " con el contenido
[
/OUT: ".\Debug /hodll.dll" /INCREMENTAL /NOLOGO /DLL /DEF: ".\hodll.def" /IGNOREIDL /DEBUG /PDB: ".\Debug/hodll.pdb" /SUBSYSTEM: WINDOWS /IMPLIB: ". \Debug/hodll .lib" /MACHINE:I386
"Debug\StdAfx.obj"
"Debug\hodll.obj"
"Debug\hodll .res"
]
La línea de comando que se está creando "link.exe @C:\DOCUME~1\wlt\LOCALS~1\Temp\RSP000031.rsp"
(Publicado por smartdj el 27-10-2008 9:36:00)
Muy buen documento, también tiene código
Gracias...
// Pero también intente ejecutar el descriptor (shyvens publicado el 25 de febrero de 2008 a las 0:37:00)
Muy claramente escrito y bien organizado.
Muy bien~~ (ahxh2000 publicado el 16 de septiembre de 2006 a las 12:03:00)
¿Qué significa lParamamp;