C++ Global KeyCounter SetWindowsHookEx

Status
Niet open voor verdere reacties.

Neo Angelus

Gebruiker
Lid geworden
27 mei 2007
Berichten
27
Hallo Iedereen,

Ik heb weer een vraagje, deze keer in het Nederlands. Ik ben op het moment een soort Manager achtig programma aan het schrijven, wat visueel alleen(voornamelijk) een tray icon met context menu is, maar dingen die ik moet doen bij houd, bij houd hoever mijn anders pc is met zijn werk en dat soort dingen. Nu keek ik naar mijn code en ik dacht wat verschrikkelijk veel...zou best willen weten hoeveel ik daarvoor heb moeten typen. Dus daarom wou ik een keycounter in de Manager bouwen(en in een aparte thread laten draaien), die het aantal keyboard drukken bij houdt.

Nu komt mijn vraag, heeft iemand één idee hoe ik daaraan moet beginnen? Ik heb namelijk geen window en ik wil graag alle key presses(sorry) over heel de computer bij houden. Tot nu toe is het me gelukt met een HWND_MESSAGE window en bij te houden hoeveel keys ik he gedrukt in dat process. Maar dit houdt niet bij hoeveel keys ik heb gedrukt in andere processen.

Dit is tot nu toe mijn code(niet [super] net zoals alles in een *.h schrijven, maar dit was tot nu toe om te testen, als de test werkt herschrijf ik alles in het net...net zoals ik brieven schrijf:p)
naKeyCounter.h:
Code:
namespace naKeyC{
	HINSTANCE hInst;
	HHOOK hHook		= NULL;
	HWND hWndMain	= NULL;
	int counter = 0 ;

	void quit(){
		UnhookWindowsHookEx(hHook);
		PostQuitMessage(0);
				
	}
	LRESULT CALLBACK KeyboardProc(int Code, WPARAM wParam, LPARAM lParam)
	{
		if(lParam & 0x40000000)
		{
			counter++;
			if(counter>2){
				quit();
			}
			
		}
		return CallNextHookEx(hHook, Code, wParam, lParam);
	}

	BOOL CALLBACK DlgProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
	{
		switch(uMessage)
		{
			case WM_CREATE:
				{
					hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInst, GetCurrentThreadId());
					if(hHook == NULL){
						MessageBox(hWnd, "Cannot load keyboard hook", "Error", MB_OK | MB_ICONERROR);
						return FALSE;
					}
				}
				return TRUE;

			case WM_CLOSE:
				EndDialog(hWnd, 0);
				PostQuitMessage(0);
				break;

			case WM_DESTROY:
				UnhookWindowsHookEx(hHook);
				break;
		}
		return DefDlgProc(hWnd, uMessage, wParam, lParam);
	}

	int startKC(HINSTANCE hInstance)
	{
		MSG Msg;
		hInst = hInstance;
		hWndMain = CreateWindowEx(0, "#32770", "Neo Angelus Key Counter",  WS_VISIBLE, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInst, 0);
		if(hWndMain == NULL) return -1;

		SetWindowLong(hWndMain, GWL_WNDPROC, (LONG)DlgProc);
		SendMessage(hWndMain, WM_CREATE, 0, 0);
		while(GetMessage(&Msg, NULL, 0, 0)) DispatchMessage(&Msg);

		return 0;
	}
}

Waarbij ik het test programma start vanuit:
main.cpp
Code:
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include "naKeyCounter.h"
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
	naKeyC::startKC(hInstance);

	return 0; 	

}

Nu dacht ik dat ik het naar global om kon zetten door WH_KEYBOARD te vervangen met WH_KEYBOARD_LL, maar dit zorgt er voor dat SetWindowsHookEx mislukt. Als ik dan ook GetCurrentThreadId() vervang door 0 dan slaagt SetWindowsHookEx weer, maar lijkt de key counter gestopt te zijn met werken.

Heeft iemand misschien een idee over hoe ik ervoor kan zorgen dat dit werkt? Of een andere manier om als dit functionaliteit in te bouwen?(het aantal keyboard presses, die ik heb gedaan bij te onthouden) Of een voorbeeld of tutorial?(voor een global dan) Ik heb zelf al wat op google gezocht, maar vindt op key counter niet echt nuttige dingen en op key logger al beter dingen, maar ben zelf meer geïnteresseerd in hoeveelheden dan welke keys(hoewel het interessant zou zijn de resultaten te analyseren om te zien welke dingen ik het meest type)

Hoop dat iemand mij kan helpen en Alvast Bedankt:D

p.s. ik laat het programma zichzelf afsluiten na 3 keypresses omdat ik anders zo snel geen manier wist om te checken of het werkt








Ok ik heb de oplossing gevonden en nu werkt het perfect. Ik heb de key Count geHooked in een *.dll die ik dan uitlees vanuit mijn programma. Als iemand anders er interesse in heeft wil ik best een gedetailleerdere uitleg geven.
 
Laatst bewerkt:
Ik weet dat dit topic erg oud is, maar aangezien de TS expliciet zei dat meer uitleg mogelijk is post ik hier maar ipv een nieuw topic te openen.
Ik probeer ongeveer hetzelfde te doen, maar dan wil ik ook nog eens communiceren naar Flash (dat komt later wel). Ik heb echter geen idee hoe je met C++ aan de slag moet, ik heb inmiddels Borland C++ gedownload. Mijn bedoeling is dus dat er op de achtergrond (ook als het programma geen focus heeft) alle toetsaanslagen telt die er gedaan worden.
Kan de TS of iemand anders me misschien op weg helpen? Ik heb dus weinig ervaring met C++ maar wel in programmeren algemeen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan