Въпросче за Dll
11 отговора
281 прегледа
Въпросче за Dll
Значи.... искам да си сетна една глобална кука, която да прихваща кратки клавиши, затова реших да си правя външен ДЛЛ. /*между другото не ми е съвсем ясно дали CallWndProc трябва да използвам в самия длл, за да хвана клавиша, ама както и да е, сега друго питам*/
Та не мога да схвана /*нито да намеря пример*/ как от самия ДЛЛ да извикам функция, която е в екзе файла ми? Смисъла е, че като прихване кратък клавиш, куката трябва да извика функция, вече достъпна в приложението ми. Адски тъпо ми се струва, ако трябва да повтарям същия код в длл-а
The#Project - нов брой с нов дизайн
Та не мога да схвана /*нито да намеря пример*/ как от самия ДЛЛ да извикам функция, която е в екзе файла ми? Смисъла е, че като прихване кратък клавиш, куката трябва да извика функция, вече достъпна в приложението ми. Адски тъпо ми се струва, ако трябва да повтарям същия код в длл-а
The#Project - нов брой с нов дизайн
Re: Въпросче за Dll
Скоро писах нещо такова
.
1. За глобален hook-a, DLL e единственто решение, защото се зарежда в всички приложения, т.е няма как да е глобален и да в ЕХЕ.
2. Най-чистия начин е като инсталираш hook-a да му предадеш една дръжка на прозорец (HWND) и после да му пращаш WM_USER + SOMETHING
#define HOOK_MESSAGE WM_USER+100
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp);
P.S От Win NT 4.0 SP4 и в Win2k/XP има две нови hook функции на ниско ниво WH_KEYBOARD_LL и WH_MOUSE_LL, които вършат повече работа. С тях може да се прихване ALT-TAB и АLT-CTRL-DEL. Разликата между hook на ниско и на високо ниво, е че на ниско ниво се викат от системата преди да се сложат в опашката на процесите, а на високо ниво във всеки процес като се получи съобщението.
1. За глобален hook-a, DLL e единственто решение, защото се зарежда в всички приложения, т.е няма как да е глобален и да в ЕХЕ.
2. Най-чистия начин е като инсталираш hook-a да му предадеш една дръжка на прозорец (HWND) и после да му пращаш WM_USER + SOMETHING
#define HOOK_MESSAGE WM_USER+100
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp);
P.S От Win NT 4.0 SP4 и в Win2k/XP има две нови hook функции на ниско ниво WH_KEYBOARD_LL и WH_MOUSE_LL, които вършат повече работа. С тях може да се прихване ALT-TAB и АLT-CTRL-DEL. Разликата между hook на ниско и на високо ниво, е че на ниско ниво се викат от системата преди да се сложат в опашката на процесите, а на високо ниво във всеки процес като се получи съобщението.
Re: Въпросче за Dll
10x :) остава да кажеш, че и ти за конвертора си го използвал /*сега отивам да го видя твоя, че ми стана интересно :)*/.
Ама днес съм малко тъп
, та не всичко разбрах:
" предадеш една дръжка на прозорец (HWND)" - това го правя в приложението си, а не в ДЛЛ-а, нали? Поне така мисля. Защото в екзето трябва да ми е SetWindowsHookEx?
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp); - а това е в куката в ДЛЛ-а ли.?Б /*заедно с дефиницята на HOOK_MESSAGE*/.
The#Project - нов брой с нов дизайн
Ама днес съм малко тъп
" предадеш една дръжка на прозорец (HWND)" - това го правя в приложението си, а не в ДЛЛ-а, нали? Поне така мисля. Защото в екзето трябва да ми е SetWindowsHookEx?
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp); - а това е в куката в ДЛЛ-а ли.?Б /*заедно с дефиницята на HOOK_MESSAGE*/.
The#Project - нов брой с нов дизайн
Re: Въпросче за Dll
Това е целия код на куката:
#include "stdafx.h"
#include "key_hook.h"
#pragma data_seg(".HOOKDATA")//Shared data among all instances.
HHOOK gHook = NULL;
HWND ghWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.HOOKDATA,RWS")//linker directive
HINSTANCE ghinstance = NULL;
/**
The DllMain function is an optional entry point into a dynamic-link library (DLL).
* @param HANDLE hModule handle to the DLL module
* @param DWORD ulReason reason for calling function
* @param LPVOID lpReserved reserved
* @return BOOL APIENTRY
*/
BOOL APIENTRY DllMain ( HANDLE hModule, DWORD ulReason, LPVOID lpReserved)
{
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
ghinstance = (HINSTANCE)hModule;
return TRUE;
}
/**
Installs the keyboard hook
* @param HWND hWnd handle of the window to recieve the notitications
* @return KEYHOOK_API BOOL
*/
KEYHOOK_API BOOL installhook (HWND hWnd)
{
gHook = NULL;
ghWnd = hWnd;
gHook = SetWindowsHookEx (WH_KEYBOARD_LL, hookproc, ghinstance,NULL);
if(gHook == NULL)
return FALSE;
return TRUE;
}
/**
Removes the hook
* @return KEYHOOK_API void
*/
KEYHOOK_API void removehook ()
{
UnhookWindowsHookEx (gHook);
}
/**
The hook functions. The lParam has be formated as WM_KEYXXX and WM_SYSKEYXXXX
* @param int nCode
* @param WPARAM wparam
* @param LPARAM lparam
* @return KEYHOOK_API LRESULT CALLBACK
*/
KEYHOOK_API LRESULT CALLBACK hookproc(int nCode,WPARAM wparam,LPARAM lparam)
{
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lparam;
if (nCode == HC_ACTION)
{
LPARAM lp = 0;
lp = pkh->scanCode << 16;
if ((pkh->flags & LLKHF_EXTENDED) == LLKHF_EXTENDED)
lp |= 1 << 24;
if ((pkh->flags & LLKHF_UP) == LLKHF_UP)
lp |= 1 << 31;
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp);//Send info to app Window.
}
return ( CallNextHookEx(gHook, nCode, wparam, lparam) );//pass control to next hook in the hook chain.
}
#include "stdafx.h"
#include "key_hook.h"
#pragma data_seg(".HOOKDATA")//Shared data among all instances.
HHOOK gHook = NULL;
HWND ghWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.HOOKDATA,RWS")//linker directive
HINSTANCE ghinstance = NULL;
/**
The DllMain function is an optional entry point into a dynamic-link library (DLL).
* @param HANDLE hModule handle to the DLL module
* @param DWORD ulReason reason for calling function
* @param LPVOID lpReserved reserved
* @return BOOL APIENTRY
*/
BOOL APIENTRY DllMain ( HANDLE hModule, DWORD ulReason, LPVOID lpReserved)
{
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
ghinstance = (HINSTANCE)hModule;
return TRUE;
}
/**
Installs the keyboard hook
* @param HWND hWnd handle of the window to recieve the notitications
* @return KEYHOOK_API BOOL
*/
KEYHOOK_API BOOL installhook (HWND hWnd)
{
gHook = NULL;
ghWnd = hWnd;
gHook = SetWindowsHookEx (WH_KEYBOARD_LL, hookproc, ghinstance,NULL);
if(gHook == NULL)
return FALSE;
return TRUE;
}
/**
Removes the hook
* @return KEYHOOK_API void
*/
KEYHOOK_API void removehook ()
{
UnhookWindowsHookEx (gHook);
}
/**
The hook functions. The lParam has be formated as WM_KEYXXX and WM_SYSKEYXXXX
* @param int nCode
* @param WPARAM wparam
* @param LPARAM lparam
* @return KEYHOOK_API LRESULT CALLBACK
*/
KEYHOOK_API LRESULT CALLBACK hookproc(int nCode,WPARAM wparam,LPARAM lparam)
{
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lparam;
if (nCode == HC_ACTION)
{
LPARAM lp = 0;
lp = pkh->scanCode << 16;
if ((pkh->flags & LLKHF_EXTENDED) == LLKHF_EXTENDED)
lp |= 1 << 24;
if ((pkh->flags & LLKHF_UP) == LLKHF_UP)
lp |= 1 << 31;
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp);//Send info to app Window.
}
return ( CallNextHookEx(gHook, nCode, wparam, lparam) );//pass control to next hook in the hook chain.
}
Re: Въпросче за Dll
Ако искаш да има глобални hotkeys за твоя програма, не е нужно да правиш кука. Има си фукция за това RegisterHotKey
Re: Въпросче за Dll
уха... още един човек в списъка с благодарностите :-) Ама правилно ли те разбирам с това последното? Мога да направя клавиш без кука? Имам предвид, че на мене ми трябва да работи като кратките на ICQ-то... Програмката е минимизирана в систрея, потребителя си бачка на word да речем, копва текст в клипборда, натиска магическия клавиш, без да клика върху програмата ми или да избира менюто, което се показва в трея, и текстът е конвертиран..
Абе я стига съм питал, отивам да чета за RegisterHotKey
.
Много благодаря
The#Project - нов брой с нов дизайн
Абе я стига съм питал, отивам да чета за RegisterHotKey
Много благодаря
The#Project - нов брой с нов дизайн
Re: Въпросче за Dll
Хм, нещо се бъгнаха клубовете пак - преди малко написах нещо, а го няма. Нищо чудно да се появи след малко и да излезе, че съм писал 2 пъти. Карай, все пак:
"Николай" ли да те пиша просто или по друг начин някак?
The#Project - нов брой с нов дизайн
"Николай" ли да те пиша просто или по друг начин някак?
The#Project - нов брой с нов дизайн
Re: Въпросче за Dll
ми също конверторче - мисля, че бях дал урл, ама все пак ето я тука
В хелпа са благодарностите
The#Project - нов брой с нов дизайн
В хелпа са благодарностите
The#Project - нов брой с нов дизайн
Re: Въпросче за Dll
Не я знаех. Добро нещо.
Моята цел беше малко по-друга. Да се взима всичко от IE без да се копира в clipboard и т.н
Моята цел беше малко по-друга. Да се взима всичко от IE без да се копира в clipboard и т.н
Re: Въпросче за Dll
аха, 10х, забелязах, че твоята е съвсем различна :) И понеже не отговори на въпроса, пиша те "Николай" там 
The#Project - нов брой с нов дизайн
The#Project - нов брой с нов дизайн