Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

syshook

519
11 апреля 2003 года
VaGon
134 / / 26.03.2003
народ помогите!
надо что бы прилада перехватывала все!!! события мыши и клавы, как то обрабатывала их а потом возращала управление винде, соответственно необходимо чтобы приладу не было видно в процессах
по крайней мере под Вынь9х...
427
11 апреля 2003 года
Glazunov Oleg
79 / / 20.03.2000
Привожу набросок проги, которую можешь взять за основу :-)

Код dll-ки:
//---------------------------------------------------------
#include <windows.h>
//---------------------------------------------------------
#define UP 1// Состояния клавиш
#define DOWN 2
#define RESET 3

int iAltKey; // Здесь хранится состояние клавиш
int iCtrlKey;
int iShiftKey;

int KEYBLAY;// Тип переключения языка
bool bSCRSAVEACTIVE;// Установлен ли ScreenSaver
MOUSEHOOKSTRUCT* psMouseHook; // Для анализа сообшений от мыши

extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHook(int,WPARAM,LPARAM);
extern "C" __declspec(dllexport) LRESULT CALLBACK MouseHook(int,WPARAM,LPARAM);

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if(reason==DLL_PROCESS_ATTACH)// Проецируем на адр. простр.
{
HKEY pOpenKey;
char* cResult=""; // Узнаём как перекл. раскладка
long lSize=2;
KEYBLAY=3;

if(RegOpenKey(HKEY_USERS,".Default\\keyboard layout\\toggle",
&pOpenKey)==ERROR_SUCCESS)
{
RegQueryValue(pOpenKey,"",cResult,&lSize);

if(strcmp(cResult,"1")==0)
KEYBLAY=1; // Alt+Shift
if(strcmp(cResult,"2")==0)
KEYBLAY=2; // Ctrl+Shift

RegCloseKey(pOpenKey);
}
else
MessageBox(0,"Не могу получить данные о способе"
"переключения раскладки клавиатуры",
"Внимание!",MB_ICONERROR);
//------------- Есть ли активный хранитель эрана
if(!SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,&bSCRSAVEACTIVE,0))
MessageBox(0,"Не могу получить данные об установленном"
"хранителе экрана", "Внимание!",MB_ICONERROR);
}
return 1;
}
//---------------------------------------------------------
void vfBeep()
{// Биканье
MessageBeep(-1);
MessageBeep(-1);// Два раза - для отчётливости
}
//---------------------------------------------------------
LRESULT CALLBACK KeyboardHook(int nCode,WPARAM wParam,LPARAM lParam)
{ // Ловушка клав. - биканье при перекл. раскладки
if((lParam>>31)&1) // Если клавиша нажата...
switch(wParam)
{// Определяем какая именно
case VK_SHIFT: {iShiftKey=UP; break;}
case VK_CONTROL: {iCtrlKey=UP; break;}
case VK_MENU: {iAltKey=UP; break;}
}
else// Если была отпущена...
switch(wParam)
{// Определяем какая именно
case VK_SHIFT: {iShiftKey=DOWN; break;}
case VK_CONTROL: {iCtrlKey=DOWN; break;}
case VK_MENU: {iAltKey=DOWN; break;}
}
//--------------
switch(KEYBLAY) // В зависимости от способа переключения раскладки
{
case 1: // Alt+Shift
{
if(iAltKey==DOWN && iShiftKey==UP)
{
vfBeep();
iShiftKey=RESET;
}
if(iAltKey==UP && iShiftKey==DOWN)
{
vfBeep();
iAltKey=RESET;
}
if((iAltKey==UP && iShiftKey==RESET)||(iAltKey==RESET && iShiftKey==UP))
{
iAltKey=RESET;
iShiftKey=RESET;
}
break;
}
//------------------------------------
case 2: // Ctrl+Shift
{
if(iCtrlKey==DOWN && iShiftKey==UP)
{
vfBeep();
iShiftKey=RESET;
}
if(iCtrlKey==UP && iShiftKey==DOWN)
{
vfBeep();
iCtrlKey=RESET;
}
if((iCtrlKey==UP && iShiftKey==RESET)||(iCtrlKey==RESET && iShiftKey==UP))
{
iCtrlKey=RESET;
iShiftKey=RESET;
}
}
}
return 0;
}
//---------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,WPARAM wParam,LPARAM lParam)
{ // Ловушка мыши - включает хранитель когда в углу
if(wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE)
{
psMouseHook=(MOUSEHOOKSTRUCT*)(lParam);
if(psMouseHook->pt.x==0 && psMouseHook->pt.y==0)
if(bSCRSAVEACTIVE) PostMessage(psMouseHook->hwnd,WM_SYSCOMMAND,SC_SCREENSAVE,0);
}
return 0;
}
//---------------------------------------------------------

Код проги:
//---------------------------------------------------------
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------
#define MYWM_NOTIFY (WM_APP+100)
#define IDC_MYICON 1006

HWND MainWnd;
NOTIFYICONDATA NotIconD;

#pragma argsused

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{// Оконная процедура
switch (uMsg)
{
case WM_DESTROY:{PostQuitMessage(0); break;}
//------------
case MYWM_NOTIFY:
{
if(lParam==WM_RBUTTONUP)
PostQuitMessage(0);
break; // Правый щелчок на значке - завершаем
}
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

BOOL InitApplication(HINSTANCE hinstance,int nCmdShow)
{ // Создание главного окна
WNDCLASS wcx; // Класс окна
wcx.style=NULL;
wcx.lpfnWndProc=MainWndProc;
wcx.cbClsExtra=0;
wcx.cbWndExtra=0;
wcx.hInstance=hinstance;
wcx.hIcon=LoadIcon(hinstance,"MAINICON");
wcx.hCursor=LoadCursor(NULL,IDC_ARROW);
wcx.hbrBackground=(HBRUSH)(COLOR_APPWORKSPACE);
wcx.lpszMenuName=NULL;
wcx.lpszClassName="HookWndClass";

if(RegisterClass(&wcx)) // Регистрируем класс
{
MainWnd=CreateWindow("HookWndClass","SSHook", /* Создаём окно */
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hinstance,NULL);
if(!MainWnd) return FALSE;
return TRUE;
}
return false;
}

void vfSetTrayIcon(HINSTANCE hInst)
{ // Значок в Tray
char* pszTip="Хранитель экрана и раскладка";// Это просто Hint
NotIconD.cbSize=sizeof(NOTIFYICONDATA);
NotIconD.hWnd=MainWnd;
NotIconD.uID=IDC_MYICON;
NotIconD.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
NotIconD.uCallbackMessage=MYWM_NOTIFY;
NotIconD.hIcon=LoadIcon(hInst,"MAINICON");
lstrcpyn(NotIconD.szTip,pszTip,sizeof(NotIconD.szTip));
Shell_NotifyIcon(NIM_ADD,&NotIconD);
}

void vfResetTrayIcon()
{// Удаляем значок
Shell_NotifyIcon(NIM_DELETE,&NotIconD);
}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
LRESULT CALLBACK (__stdcall *pKeybHook)(int,WPARAM,LPARAM);
LRESULT CALLBACK (__stdcall *pMouseHook)(int,WPARAM,LPARAM);

MSG msg;
HINSTANCE hLib;
HHOOK hKeybHook; HHOOK hMouseHook;
//----------------
hLib=LoadLibrary("Hook.dll");
if(hLib)
{
(void*)pKeybHook=GetProcAddress(hLib,"KeyboardHook");
hKeybHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)(pKeybHook),hLib,0);// Ставим ловушки
(void*)pMouseHook=GetProcAddress(hLib,"MouseHook");
hMouseHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)(pMouseHook),hLib,0);
//-------------------------------
if (InitApplication(hInstance,nCmdShow))// Если создали главное окно
{
vfSetTrayIcon(hInstance);// Установили значок
while (GetMessage(&msg,(HWND)(NULL),0,0))
{// Цикл обработки сообщений
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//---------------------------------- Всё - финал
UnhookWindowsHookEx(hKeybHook); // Снимаем ловушки
UnhookWindowsHookEx(hMouseHook);
FreeLibrary(hLib);// Отключаем DLL
vfResetTrayIcon();// Удаляем значок
return 0;
}
}
return 1;
}
//---------------------------------------------------------
519
14 апреля 2003 года
VaGon
134 / / 26.03.2003
Цитата:
Originally posted by Glazunov Oleg
Привожу набросок проги, которую можешь взять за основу :-)...



Спасибо, еще не разбирался, но на первый взгляд то что нужно... :)

519
30 апреля 2003 года
VaGon
134 / / 26.03.2003
а кто нить подскажет какими бывают
WPARAM wParam и LPARAM lParam для мыши и клавы в функциях hook`ах?
519
01 мая 2003 года
VaGon
134 / / 26.03.2003
И еще, может кто нибудь подскажет как сделать что бы
при перехвате сообщения оно дальше не пересылалось винде
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог