Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Haki

Ostatnio zmodyfikowano 2011-05-08 15:40
Autor Wiadomość
kt1117
Temat założony przez niniejszego użytkownika
» 2011-05-07 21:24:34
Czyli muszę pobrać kod błędu?
E:Chyba raczej nie,bo ta funkcja nie podaje kodu błędu.
E2:Wpisałem linijkę po założeniu haka:
C/C++
MessageBox( hwnd,( CHAR * ) g_MyHook, NULL, NULL );
Zwróciło puste okienko.
P-32801
malan
» 2011-05-07 21:43:31
Przecież wszystko masz napisane na msdn...
SetWindowsHookEx Function (msdn)
Return Value
Type: HHOOK
If the function succeeds, the return value is the handle to the hook procedure.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

..., czyli na przykład:
C/C++
#include <fstream>
//...
g_MyHook = SetWindowsHookEx( WH_KEYBOARD, & AltF4Proc, NULL, 0 );
if( !g_MyHook )
{
    DWORD errorCode = GetLastError();
   
    std::ofstream log( "log.txt" );
    if( log.good() )
    {
        log << "Kod błędu: " << errorCode << '\n';
    }
    //...
}
P-32803
kt1117
Temat założony przez niniejszego użytkownika
» 2011-05-07 22:07:17
Bez sensu, zrobiłem coś takiego:
C/C++
#include <windows.h>

HHOOK g_MyHook = NULL;

HWND hwnd;
DWORD errorCode;

/*  Declare Windows procedure  */
LRESULT CALLBACK AltF4Proc( int code, WPARAM wParam, LPARAM lParam );
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );

/*  Make the class name into a global variable  */
char szClassName[] = "CodeBlocksWindowsApp";

int WINAPI WinMain( HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow )
{ /* This is the handle for our window */
    MSG messages; /* Here messages to the application are saved */
    WNDCLASSEX wincl; /* Data structure for the windowclass */
   
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* Catch double-clicks */
    wincl.cbSize = sizeof( WNDCLASSEX );
   
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hCursor = LoadCursor( NULL, IDC_ARROW );
    wincl.lpszMenuName = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND;
   
    /* Register the window class, and if it fails quit the program */
    if( !RegisterClassEx( & wincl ) )
         return 0;
   
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx(
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    "Code::Blocks Template Windows App", /* Title Text */
    WS_OVERLAPPEDWINDOW, /* default window */
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    544, /* The programs width */
    375, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    NULL, /* No menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );
   
   
   
   
    /* Make the window visible on the screen */
    ShowWindow( hwnd, nCmdShow );
    MessageBox( hwnd, "Komunikat na pulpicie", NULL, NULL );
    g_MyHook = SetWindowsHookEx( WH_KEYBOARD, & AltF4Proc, NULL, NULL );
   
    if( !g_MyHook )
    {
        errorCode = GetLastError();
       
    }
    MessageBox( hwnd,( CHAR * ) g_MyHook, NULL, NULL );
   
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while( GetMessage( & messages, NULL, 0, 0 ) )
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage( & messages );
        /* Send message to WindowProcedure */
        DispatchMessage( & messages );
    }
   
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}

LRESULT CALLBACK AltF4Proc( int code, WPARAM wParam, LPARAM lParam )
{
   
    if( code < 0 ) return CallNextHookEx( 0, code, wParam, lParam );
   
    if( wParam == VK_F4 &&( lParam & 536870912 ) )
    {
        MessageBox( hwnd, "Nie zamkniesz mnie tak ³atwo!", NULL, MB_ICONEXCLAMATION );
        return 1;
    }
   
    return CallNextHookEx( 0, code, wParam, lParam );
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message ) /* handle the messages */
    {
    case WM_DESTROY:
        UnhookWindowsHookEx( g_MyHook );
        PostQuitMessage( 0 ); /* send a WM_QUIT to the message queue */
        break;
    case WM_KEYDOWN:
        if( wParam == VK_LEFT )
        {
            Beep( 1000, 222 );
        }
       
        if( wParam == VK_RIGHT )
        {
            Beep( 2000, 222 );
        }
       
       
        break;
        default: /* for messages that we don't deal with */
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return errorCode;
}
I zwróciło mi zero! Bez sensu, bo sprawdzałem w spisie i wyszło mi:The operation completed successfully. Występuje błąd a jednak wszystko jest ok? Czegoś tu nie rozumiem.
E:A jednak nie, bo jak zrobiłem twoim sposobem to zwróciło mi liczbę niezerową. Zaraz sprawdzę o co kaman.
E2:Nie można założyć globalnego haka, bez uchwytu do modułu.
E3:Wyczytałem gdzieś, że funkcja nie wykona się, jeśli 2 ostatnie argumenty to NULL, już nie wiem co z tym robić. Muszę skądś wytrzasnąć ID wątku.
P-32805
malan
» 2011-05-08 14:06:42
P-32843
kt1117
Temat założony przez niniejszego użytkownika
» 2011-05-08 15:40:20
Działa!!! A ja odrzuciłem na początku i nie sprawdzałem jej, bo mówiłeś że jakaś podobna jest dostępna dopiero od Visty, ale dzięki, problem rozwiązany, zamykam temat.
E:Albo nie, bo mam nowy problem, tworzę teraz haki globalne i mam kod dll'i:
-.cpp:
C/C++
#include "main.h"


BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
    g_hInst = hModule;
   
    switch( ul_reason_for_call )
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
   
    return TRUE;
}
-.h:
C/C++
#ifndef _MAIN_H_
#define _MAIN_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

#include <windows.h>
#include <vector>
using namespace std;

vector < EVENTMSG >
g_Events;
int g_CurrentEvent;
bool g_PlaybackStopped;
HHOOK g_RecordHook = NULL;
HHOOK g_PlaybackHook = NULL;
DWORD g_StartTime = 0;
HINSTANCE g_hInst = NULL;

DLL_API LRESULT CALLBACK RecordProc( int code, WPARAM wParam, LPARAM lParam )
{
    if( code < 0 ) return CallNextHookEx( 0, code, wParam, lParam );
   
    if( code == HC_ACTION )
    {
        EVENTMSG * msg =( EVENTMSG * ) lParam;
        msg->time -= g_StartTime;
        g_Events.push_back( * msg );
        return 0;
    }
   
    return CallNextHookEx( 0, code, wParam, lParam );
}

DLL_API LRESULT CALLBACK PlaybackProc( int code, WPARAM wParam, LPARAM lParam )
{
    if( code < 0 ) return CallNextHookEx( 0, code, wParam, lParam );
   
    if( code == HC_GETNEXT )
    {
        EVENTMSG * msg =( EVENTMSG * ) lParam;
        msg->hwnd = g_Events[ g_CurrentEvent ].hwnd;
        msg->message = g_Events[ g_CurrentEvent ].message;
        msg->paramH = g_Events[ g_CurrentEvent ].paramH;
        msg->paramL = g_Events[ g_CurrentEvent ].paramL;
        msg->time = g_StartTime + g_Events[ g_CurrentEvent ].time;
        DWORD delta = msg->time - GetTickCount();
       
        if( delta > 0 )
             return delta;
        else
             return 0;
       
    }
    else if( code == HC_SKIP )
    {
        if( !g_PlaybackStopped )
             g_CurrentEvent++;
       
        if( g_CurrentEvent >= g_Events.size() )
        {
            g_CurrentEvent = 0;
            g_StartTime = GetTickCount();
            g_PlaybackStopped = false;
            return 0;
        }
    }
   
    return 0;
}

DLL_API void StartRecording( void )
{
    g_StartTime = GetTickCount();
    g_RecordHook = SetWindowsHookEx( WH_JOURNALRECORD, RecordProc, g_hInst, 0 );
}

DLL_API void StartPlayback( void )
{
    g_CurrentEvent = 0;
    g_StartTime = GetTickCount();
    g_PlaybackStopped = false;
    UnhookWindowsHookEx( g_RecordHook );
    g_PlaybackHook = SetWindowsHookEx( WH_JOURNALPLAYBACK, PlaybackProc, g_hInst, 0 );
}

extern "C"
{
    DLL_API void StartPlayback( void );
    DLL_API void StartRecording( void );
}

#endif /* _DLL_H_ */
I kompilator nie rozpoznaje makra DLL_API, wywala błędy:

w\hakglobalny\main.h|23|error: 'DLL_API' does not name a type|
w\hakglobalny\main.h|38|error: 'DLL_API' does not name a type|
w\hakglobalny\main.h|75|error: expected constructor, destructor, or type conversion before 'void'|
w\hakglobalny\main.h|81|error: expected constructor, destructor, or type conversion before 'void'|
w\hakglobalny\main.h|92|error: expected constructor, destructor, or type conversion before 'void'|
w\hakglobalny\main.h|93|error: expected constructor, destructor, or type conversion before 'void'|
P-32846
1 « 2 »
Poprzednia strona Strona 2 z 2