Page 1 of 1

Thread Handle

Posted: 14 Sep 2007, 01:24
by Nemok
Salut,

Stie cineva cum pot afla IDul unui thread din interiorul acestuia?
Ma chinui de cateva zile sa fac un program care foloseste SetWindowsHookEx pt a inregistra toate actiunile mouse-ului si ale tastaturii. Partea de inregistrare este gata. Problema e cu redare (WH_JOURNALPLAYBACK). Pur si simplu nu vrea sa mearga in aplicatia curenta (desi codul mergea intr-o alta applicatie MFC cu dialog). In aplicatia curenta nu folosesc MFC si nici ferestre.
Oricum am nevoie de thread pt functia SetWindowsHookEx, sa vad poate asha merge...

Mersi.

Re: Thread Handle

Posted: 14 Sep 2007, 10:18
by Ovidiu Cucu
Salut si bine ai venit la noi! :)

GetCurrentThreadId nu merge?

Re: Thread Handle

Posted: 14 Sep 2007, 11:51
by Hannibal
Pai nu inteleg ce vrei.

Cand folosesti WH_JOURNALRECORD pentru a inregistra, inregistrezi toate actiunile mouse-ului si tastaturii care au loc in desktopul curent ( indiferent de aplicatie, procese sau threaduri) - si este treaba ta sa salvezi ce te intereseaza din EVGENTMSG intr-un storage propriu. Cand folosesti WH_JOURNALPLAYBACK, Windows ia controlul asupra tastaturii si mouse-ului si-ti apeleaza callback-ul tau ca tu sa completezi EVENTMSG-ul primit cu date citite din storage.

Nu are sens sa salvezi threadID-ul pentru ca nu-ti garanteaza nimeni ca la doua rulari succesive ale aplicatiei vei obtine acelasi ThreadID. In EVENTMSG ai in schimb parametru hwnd si poti sa faci filtrare de mesaje doar pentru ferestrele tale ( evident trebuie sa ai o evidenta a acestora).Cand faci SetWindowHookEx ori cunosti ThreadID-ul pentru care vrei sa instalezi hook-ul ori folosesti 0 pentru a instala un hook global.

De fapt ce nu merge? Nu se apeleaza hook-ul tau cand faci WH_JOURNALPLAYBACK sau desi tu completezi corect mesajele aplicatia nu pare a le primi?

Later edit :
As long as a JournalPlaybackProc hook procedure is installed, regular mouse and keyboard input is disabled.

Re: Thread Handle

Posted: 15 Sep 2007, 04:19
by Nemok
Ovidiu Cucu wrote:Salut si bine ai venit la noi! :)

GetCurrentThreadId nu merge?

Salut si bine v-am gasit :).

Spre rusinea mea nu stiam de GetCurrentThreadId :oops:
Hannibal wrote:Pai nu inteleg ce vrei.

Cand folosesti WH_JOURNALRECORD pentru a inregistra, inregistrezi toate actiunile mouse-ului si tastaturii care au loc in desktopul curent ( indiferent de aplicatie, procese sau threaduri) - si este treaba ta sa salvezi ce te intereseaza din EVGENTMSG intr-un storage propriu. Cand folosesti WH_JOURNALPLAYBACK, Windows ia controlul asupra tastaturii si mouse-ului si-ti apeleaza callback-ul tau ca tu sa completezi EVENTMSG-ul primit cu date citite din storage.

Nu are sens sa salvezi threadID-ul pentru ca nu-ti garanteaza nimeni ca la doua rulari succesive ale aplicatiei vei obtine acelasi ThreadID. In EVENTMSG ai in schimb parametru hwnd si poti sa faci filtrare de mesaje doar pentru ferestrele tale ( evident trebuie sa ai o evidenta a acestora).Cand faci SetWindowHookEx ori cunosti ThreadID-ul pentru care vrei sa instalezi hook-ul ori folosesti 0 pentru a instala un hook global.

De fapt ce nu merge? Nu se apeleaza hook-ul tau cand faci WH_JOURNALPLAYBACK sau desi tu completezi corect mesajele aplicatia nu pare a le primi?
Stiu cum functioneaza WH_JOURNALRECORD si WH_JOURNALPLAYBACK. Am deja codul pentru inregistrare si redare scris. Vreau sa instalez un hook global.
Problema e urmatoarea: Am scris codul de redare intr-o applicatie MFC, cu dialog si totul merge perfect.
Acum insa vreau sa folosesc codul de redare intr-o aplicatie simpla fara MFC sau fereastra (Win32 fara consola) dar acelasi cod nu mai functioneaza aici. De 3 zile incerc sa ii dau de cap dar nu reusesc. Plec de la concluzia ca inregistrarea este in regula,am verificat structurile inregistrate par ok. Problema e ca functia CALLBACK JournalPlaybackFunc nu este apelata (functia SetWindowsHookEx este apelata). Bine nu stiu exact c se intampla dupa SetWindowsHookEx deoarece in debug cand incerc sa vad c se petrece dupa ea se blocheaza mouse-ul (actiunile nu sunt reproduse) si nu se mai intampla nimic (iar cand ies cu CTRL+ALT+DEL applicatia se inchide) asta cu toate ca atunci cand rulez aplicatia normal (tot versiune de debug dar nu in debugging) nu se intampla nimic, applicatia iese imediat.
Nu pot sa imi dau seama care e problema :cry:
Aveam nevoie de ThreadID doar ca o alta incercare disperata sa imi dau seama ce nu merge. Vroiam sa ii dau functiei SetWindowsHooks ce porneste redarea IDul threadului curent sa vad diferenta....

Daca ai vreo idee, te rog anunta-ma

Re: Thread Handle

Posted: 15 Sep 2007, 12:57
by soso
Toate hook-urile instalate cu SetWindowsHookEx au legatura cu mesajele Windows si au nevoie de o bucla de mesaje. Chiar daca instalezi un hook global, iti trebuie o bucla de mesaje in aplicatie pentru ca mecanismul sa functioneze corect. O aplicatie consola nu are bucla de mesaje si din motivul asta nu ti se apeleaza functia callback.

Soso

Re: Thread Handle

Posted: 15 Sep 2007, 18:51
by Nemok
M-am gandit si la asta....
Am incercat deja cu o bucla de mesaje. Am pus functia de playback intr-un thread now:

Code: Select all

_beginthread( PlayRec, 0, &hInstance );

			MSG msg;
			BOOL bRet;
			while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 ) 
			{ 
				if (bRet == -1 || msg.message==WM_QUIT)
				{
					break;
				}
				else if (Advanced.abort)
				{
					Advanced.abort=false;
					break;
				}
				else
				{ 
					TranslateMessage(&msg); 
					DispatchMessage(&msg); 
				} 

			} 

Apropo, aplicatia nu foloseste consola (pur si simplu nu are nici o fereastra) si tot codul este pus in InitInstance().
Nu cred ca trebuie sa aiba neaparat o bucla de mesaje, oricum nu merge nici cu nici fara....:( :( :(
Ajutor.......

Re: Thread Handle

Posted: 15 Sep 2007, 23:05
by soso
Ai o bucla de mesaje, dar daca nu ai nici o fereatra ce mesaje crezi ca iti vin? Fa o aplicatie Windows simpla cu o fereastra dar ascunde fereastra daca nu vrei sa apara pe ecran si o sa iti functioneze.

Soso

Re: Thread Handle

Posted: 16 Sep 2007, 00:13
by Nemok
Vroiam sa evit chestia asta...dar pana la urma cred ca asha o sa fac...

Re: Thread Handle

Posted: 16 Sep 2007, 01:38
by Nemok
Poti sa imi spui ce gresesc...
Am adugat o fereastra normala (Overlaped) dar tot nu merge....

Code: Select all

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: Place code here.
	MSG msg;

	// Initialize global strings
	strcpy_s((char*)szTitle,100,"nMacro Player");
	strcpy_s((char*)szWindowClass,100,"nmPlayer");
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (lpCmdLine))
	{
		return FALSE;
	}

///////////////////////////////MAIN/////////////////////////////////////////
	_beginthread( _Main, 0, 0 );///aici este codul care porneste redarea
////////////////////////////////////////////////////////////////////////////
	//_Main(0);
	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0))
	{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
	}

	return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UNBIN));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= 0;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

BOOL InitInstance(LPSTR szCmdLine)
{
	Crc32Dynamic->Init();
	InitCommonControls();

	 HWND hWnd;

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW|WS_EX_TOOLWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0 , NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, SW_SHOW);
   UpdateWindow(hWnd);

   return TRUE;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Parse the menu selections:
		switch (wmId)
		{
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Se pare ca nu vrea deloc sa mearga...e ultima chestie care trebuie sa o fac la aplicatia asta dar se pare k nu merge orice i-as face. :|

Re: Thread Handle

Posted: 16 Sep 2007, 13:47
by soso
In aplicatia MFC unde aparea bucata asta de cod?

Code: Select all

///////////////////////////////MAIN/////////////////////////////////////////
   _beginthread( _Main, 0, 0 );///aici este codul care porneste redarea
////////////////////////////////////////////////////////////////////////////
Soso

Re: Thread Handle

Posted: 16 Sep 2007, 16:12
by Nemok
E in OnInitDialog:

Code: Select all

BOOL CunbinDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	StartPlayback();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

Re: Thread Handle

Posted: 17 Sep 2007, 01:15
by Nemok
Am incercat sa il pun la WM_CREAT aici dar tot nu se intampla nimic. SetWindowHooks nu returneaza eroare dar nu se intampla nimic totusi...

Code: Select all

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_CREATE:
		_beginthread( _Main, 0, 0 );
		MessageBeep(-1);
		break;
Ai vreao idee?

Mersi.

Re: Thread Handle

Posted: 17 Sep 2007, 11:03
by Viorel
Conform MSDN, interceptările WH_JOURNALPLAYBACK şi WH_JOURNALRECORD se efectuează numai la nivel global. Prin urmare funcţiile specificate în SetWindowsHookEx urmează a fi plasate într-un DLL. Foloseşti un astfel de DLL?

Re: Thread Handle

Posted: 17 Sep 2007, 11:57
by soso
Eu vad ca in aplicatia MFC ai StartPlayback(). Metoda aia ce face, porneste thread-ul sau instaleaza hook-ul?

Soso

Re: Thread Handle

Posted: 17 Sep 2007, 15:49
by Nemok
Am rezolvat!!!

Am pus la WM_CREATE functia _Main() simplu fara a crea un nou thread. Ciudat pt k atunci cand am pus-o in WinMain tot la fel simplu fara a crea un nou thread, nu a mers. Oricum acum merge bine. Acum insa va trebui sa gasesc o metoda pt a face functia _Main sa astepte pana se termine redarea (adik vreau cumva o redare modala)...

Mersi mult pentru ajutor Soso.