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: MessageBox( hwnd,( CHAR * ) g_MyHook, NULL, NULL );
Zwróciło puste okienko. |
|
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: #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'; } } |
|
kt1117 Temat założony przez niniejszego użytkownika |
» 2011-05-07 22:07:17 Bez sensu, zrobiłem coś takiego: #include <windows.h>
HHOOK g_MyHook = NULL;
HWND hwnd; DWORD errorCode;
LRESULT CALLBACK AltF4Proc( int code, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );
char szClassName[] = "CodeBlocksWindowsApp";
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow ) { MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof( WNDCLASSEX ); wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wincl.hCursor = LoadCursor( NULL, IDC_ARROW ); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND; if( !RegisterClassEx( & wincl ) ) return 0; hwnd = CreateWindowEx( 0, szClassName, "Code::Blocks Template Windows App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); 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 ); while( GetMessage( & messages, NULL, 0, 0 ) ) { TranslateMessage( & messages ); DispatchMessage( & messages ); } 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 ); }
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_DESTROY: UnhookWindowsHookEx( g_MyHook ); PostQuitMessage( 0 ); break; case WM_KEYDOWN: if( wParam == VK_LEFT ) { Beep( 1000, 222 ); } if( wParam == VK_RIGHT ) { Beep( 2000, 222 ); } break; default: 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. |
|
malan |
» 2011-05-08 14:06:42 |
|
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: #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: #ifndef _MAIN_H_ #define _MAIN_H_
#if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else # define DLLIMPORT __declspec (dllimport) #endif
#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
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'|
|
|
1 « 2 » |