Thread Handle

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Thread Handle

Post by Nemok » 14 Sep 2007, 01:24

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.


keeping things simple...

Motivul pentru care intreb: NKProds.com :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Thread Handle

Post by Ovidiu Cucu » 14 Sep 2007, 10:18

Salut si bine ai venit la noi! :)

GetCurrentThreadId nu merge?

User avatar
Hannibal
Membru
Membru
Posts: 104
Joined: 30 Jul 2007, 15:18
Location: Bucuresti
Contact:

Re: Thread Handle

Post by Hannibal » 14 Sep 2007, 11:51

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.
For the End of the World spell, press control, alt, delete.

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 15 Sep 2007, 04:19

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
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

soso
Junior
Junior
Posts: 36
Joined: 27 Jul 2007, 17:20

Re: Thread Handle

Post by soso » 15 Sep 2007, 12:57

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

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 15 Sep 2007, 18:51

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.......
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

soso
Junior
Junior
Posts: 36
Joined: 27 Jul 2007, 17:20

Re: Thread Handle

Post by soso » 15 Sep 2007, 23:05

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

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 16 Sep 2007, 00:13

Vroiam sa evit chestia asta...dar pana la urma cred ca asha o sa fac...
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 16 Sep 2007, 01:38

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. :|
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

soso
Junior
Junior
Posts: 36
Joined: 27 Jul 2007, 17:20

Re: Thread Handle

Post by soso » 16 Sep 2007, 13:47

In aplicatia MFC unde aparea bucata asta de cod?

Code: Select all

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

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 16 Sep 2007, 16:12

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
}
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 17 Sep 2007, 01:15

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.
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

Viorel
Microsoft MVP
Microsoft MVP
Posts: 292
Joined: 13 Jul 2007, 12:26

Re: Thread Handle

Post by Viorel » 17 Sep 2007, 11:03

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?

soso
Junior
Junior
Posts: 36
Joined: 27 Jul 2007, 17:20

Re: Thread Handle

Post by soso » 17 Sep 2007, 11:57

Eu vad ca in aplicatia MFC ai StartPlayback(). Metoda aia ce face, porneste thread-ul sau instaleaza hook-ul?

Soso

User avatar
Nemok
Junior
Junior
Posts: 40
Joined: 10 Sep 2007, 05:04
Location: Bacau / Iasi
Contact:

Re: Thread Handle

Post by Nemok » 17 Sep 2007, 15:49

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.
keeping things simple...

Motivul pentru care intreb: NKProds.com :)

Post Reply