Въпросче за Dll

11 отговора 281 прегледа
#1

Въпросче за Dll

Значи.... искам да си сетна една глобална кука, която да прихваща кратки клавиши, затова реших да си правя външен ДЛЛ. /*между другото не ми е съвсем ясно дали CallWndProc трябва да използвам в самия длл, за да хвана клавиша, ама както и да е, сега друго питам*/
Та не мога да схвана /*нито да намеря пример*/ как от самия ДЛЛ да извикам функция, която е в екзе файла ми? Смисъла е, че като прихване кратък клавиш, куката трябва да извика функция, вече достъпна в приложението ми. Адски тъпо ми се струва, ако трябва да повтарям същия код в длл-а

The#Project - нов брой с нов дизайн
Отговор
в отговор на voyager #2

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 на ниско и на високо ниво, е че на ниско ниво се викат от системата преди да се сложат в опашката на процесите, а на високо ниво във всеки процес като се получи съобщението.


Отговор
в отговор на Hиkoлaй #3

Re: Въпросче за Dll

10x :) остава да кажеш, че и ти за конвертора си го използвал /*сега отивам да го видя твоя, че ми стана интересно :)*/.
Ама днес съм малко тъп , та не всичко разбрах:
" предадеш една дръжка на прозорец (HWND)" - това го правя в приложението си, а не в ДЛЛ-а, нали? Поне така мисля. Защото в екзето трябва да ми е SetWindowsHookEx?
PostMessage(ghWnd, HOOK_MESSAGE, pkh->vkCode, lp); - а това е в куката в ДЛЛ-а ли.?Б /*заедно с дефиницята на HOOK_MESSAGE*/.

The#Project - нов брой с нов дизайн
Отговор
в отговор на voyager #4

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.
}


Отговор
в отговор на voyager #5

Re: Въпросче за Dll

Ако искаш да има глобални hotkeys за твоя програма, не е нужно да правиш кука. Има си фукция за това RegisterHotKey

Отговор
в отговор на Hиkoлaй #6

Re: Въпросче за Dll

уха... още един човек в списъка с благодарностите :-) Ама правилно ли те разбирам с това последното? Мога да направя клавиш без кука? Имам предвид, че на мене ми трябва да работи като кратките на ICQ-то... Програмката е минимизирана в систрея, потребителя си бачка на word да речем, копва текст в клипборда, натиска магическия клавиш, без да клика върху програмата ми или да избира менюто, което се показва в трея, и текстът е конвертиран..
Абе я стига съм питал, отивам да чета за RegisterHotKey .
Много благодаря

The#Project - нов брой с нов дизайн
Отговор
в отговор на voyager #7

Re: Въпросче за Dll

Да правилно.

Отговор
в отговор на Hиkoлaй #8

Re: Въпросче за Dll

Хм, нещо се бъгнаха клубовете пак - преди малко написах нещо, а го няма. Нищо чудно да се появи след малко и да излезе, че съм писал 2 пъти. Карай, все пак:
"Николай" ли да те пиша просто или по друг начин някак?

The#Project - нов брой с нов дизайн
Отговор
в отговор на voyager #9

Re: Въпросче за Dll

За каква програма става дума?

Отговор
в отговор на Hиkoлaй #10

Re: Въпросче за Dll

ми също конверторче - мисля, че бях дал урл, ама все пак ето я тука
В хелпа са благодарностите

The#Project - нов брой с нов дизайн
Отговор
в отговор на voyager #11

Re: Въпросче за Dll

Не я знаех. Добро нещо.
Моята цел беше малко по-друга. Да се взима всичко от IE без да се копира в clipboard и т.н

Отговор
в отговор на Hиkoлaй #12

Re: Въпросче за Dll

аха, 10х, забелязах, че твоята е съвсем различна :) И понеже не отговори на въпроса, пиша те "Николай" там

The#Project - нов брой с нов дизайн
Отговор