dzejo napisał(a)
Jeśli chodzi o wyświetlenie konsoli z wynikami to np:
[patrz -> nie artykuł tylko komentarz 'manfredka' dnia 29-04-2009 15:02]
Prosta konsola dla programów okienkowych w WinAPI
Jak słusznie crayze zauważył artykuł i komentarz manfredka są zbędne w tytułowym przypadku, wystarczy utworzyć projekt konsolowy, w nim też możemy robić okienka. A tak swoją drogą to autor nie chce mieć w ogóle okienek tylko samą konsolę.
dzejo napisał(a)
Przechwytywanie mychy - szukaj mouse hook...
jak najbardziej, poniżej zaprezentuję rozwiązanie
dzejo napisał(a)
Aby mieć pętle komunikatów w programie możesz utwożyć okno ale go nie wyświetlać , ma służyć tylko do podpięcia WinProc z message .
Nie trzeba mieć żadnego okna. Nawet jeśli by chcieć uchwyt okna tylko do komunikatów to robi się okno message-only.
Poniżej zaprezentuje samą kolejkę bo się przyda, z tego co zauważyłem wątek zakładający WH_JOURNALRECORD musi mieć kolejkę komunikatów. Kolejka ta przyda się również do gromadzenia wiadomości przechwytywanych przez hook. A o to kod:
#include <windows.h>
#include <iostream>
using namespace std;
HINSTANCE g_hInst;
HHOOK g_hHook;
DWORD g_dwMainThreadId;
//procedura hook'a
LRESULT CALLBACK JournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam);
//procedura sygnalu zamkniecia okna konsoli
BOOL WINAPI ConsoleCtrlHandle(DWORD dwCtrlType);
//wyswietla ostatni blad
DWORD ShowLastError(LPCSTR lpszFunction);
int main(int argc, char* argv[])
{
g_hInst = GetModuleHandle(NULL);
g_dwMainThreadId = GetCurrentThreadId();
//zakaladamy hook
g_hHook = SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, GetModuleHandle(NULL), 0);
if (g_hHook == NULL) return ShowLastError("SetWindowsHookEx");
//przechwytujemy sygnal zamkniecia okna konsoli
SetConsoleCtrlHandler(ConsoleCtrlHandle, TRUE);
//petla komuniaktow
MSG msg;
while(GetMessage(&msg, 0, 0, 0))
{
switch (msg.message)
{
//wyswietlamy przechwycony WM_MOUSEMOVE
case WM_MOUSEMOVE:
cout << "X: " << LOWORD(msg.lParam) << " Y: " << HIWORD(msg.lParam) << endl;
break;
case WM_CANCELJOURNAL:
//zakladamy hook ponownie jesli zostal zdjety
g_hHook = SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, GetModuleHandle(NULL), 0);
if (g_hHook == NULL) return ShowLastError("SetWindowsHookEx");
}
}
//sciagamy hook
if(g_hHook != NULL) UnhookWindowsHookEx(g_hHook);
return msg.wParam;
}
LRESULT CALLBACK JournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
//przesylamy kazdy komunikat WM_MOUSEMOVE
if (((EVENTMSG*)lParam)->message == WM_MOUSEMOVE)
{
WORD x = ((EVENTMSG*)lParam)->paramL;
WORD y = ((EVENTMSG*)lParam)->paramH;
PostThreadMessage(g_dwMainThreadId, WM_MOUSEMOVE, 0, MAKELONG(x, y));
}
return 0;
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
BOOL WINAPI ConsoleCtrlHandle(DWORD dwCtrlType)
{
//wysylamy komunikat przerywajacy petle komunikatow
PostThreadMessage(g_dwMainThreadId, WM_QUIT, 0, 0);
return TRUE;
}
DWORD ShowLastError(LPCSTR lpszFunction)
{
LPSTR lpMsgBuf;
DWORD dwError = GetLastError();
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR) &lpMsgBuf,
0, NULL );
cout << lpszFunction << " failed with error " << dwError << ": " << lpMsgBuf;
LocalFree(lpMsgBuf);
return dwError;
}
Jakby co niejasne było to pytaj.