الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]اسئلة عن HOOK

مغلقرائج
بدأه الاخير زمانه في 6 أغسطس 2006 · 51 رد · 7,163 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

كيف الصحة اخواني ؟؟

لقد دخت السبع دوخات وانا اقرء عن ال hook اقصد (Sys. Hook ) ، المشكلة ان الكلام النظري و الشرح متوفر لكن الامثلة جد شحيحة .. حتى اني لم اجد مثال واحد متكامل في لغة الفيجوال سي ..

بعد القراءة والاستعانة (بالله اولا) ثم ب MSDN وجدت بها مثال لكنه ايضا غير كامل ..

المهم .. الكود التالي ..

ارجو القاء نظرة عليه ..

#include<shlobj.h>
#include <windows.h>

HWND hwnd;

typedef struct _MYHOOKDATA 
{ 
	int nType; 
	HOOKPROC hkprc; 
	HHOOK hhook; 
} MYHOOKDATA; 

MYHOOKDATA myhookdata[1];

LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 

MessageBox(hwnd,"hooking .. success","",MB_OK);
   return CallNextHookEx(myhookdata[0].hhook, nCode, wParam, 
		lParam); 


}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
تكوين النافذة //	

}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch(msg)
	{


case WM_CREATE: 
	myhookdata[0].nType = WH_MOUSE; 
			myhookdata[0].hkprc = MouseProc; 
			break;

case WM_LBUTTONDOWN:

	 myhookdata[0].hhook = SetWindowsHookEx( 
							myhookdata[0].nType, 
							myhookdata[0].hkprc, 
							(HINSTANCE) NULL, GetCurrentThreadId()); 

	break;
case WM_RBUTTONDOWN:

UnhookWindowsHookEx(myhookdata[0].hhook); 

		break;


	case WM_DESTROY:

			PostQuitMessage(0);
		break;

		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}

	return 0;
}

اعتقد ان العملية نجحت .. لكن ..

لدي كم سؤال !!

ارجو التوضيح عن الدالة

   return CallNextHookEx(myhookdata[0].hhook, nCode, wParam, 
		lParam);

يعني هذه الخطوة .. ما فائدتها ؟؟؟

وما فائدة المتغير الثالث و الرابع في دالة ال SetWindowsHookEx

و ايضا ..

الان عند الضغط على زر الماوس الايسر تظهر المسج ..

لكن .. كيف من الممكن ان اغلق المسج ..

يعني عندما تظهر المسج لا سبيل لإغلاق البرنامج إلا بأختيار stop debug .. او مرات او مرات من task manager

كيف احل هذه المشكلة ؟؟

حتى اني غيرت الترتيب .. بهذه الطريقة :

case WM_RBUTTONDOWN:

	 myhookdata[0].hhook = SetWindowsHookEx( 
							myhookdata[0].nType, 
							myhookdata[0].hkprc, 
							(HINSTANCE) NULL, GetCurrentThreadId()); 

	break;
case WM_LBUTTONDOWN:

UnhookWindowsHookEx(myhookdata[0].hhook); 

		break;

************

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 

	MessageBox(hwnd,"you press R button Mouse .. ","",MB_OK);
CallNextHookEx(myhookdata[0].hhook, nCode, wParam, 
	   lParam); 


}

نفس المشكلة .. عندما تظهر المسج لا يمكن ان تذهب ولا استطيع ان اغلق البرنامج .

***

شي ثاني ..

كيف لي ان اوقف عمل زر الماوس ؟؟

يعني مثلا الان عندما يضغط المستخدم زر الماوس الايسر تتنفذ دالة ال hook ، كيف لي بداخل هذه الدالة ان اوقف عمل زر الماوس الايمن مثلا ؟؟

و شي اخير ..

ما علاقة الهوك مع dll ، وانه يجب ان اكتب dll ،

يعني مثلا شيء من هذا القبيل ..

You must place a global hook procedure in a DLL separate from the application installing the hook procedure.

ما معناه ؟؟؟

الان الهوك يعمل فقط على برنامجي .. اذا اردت ان يعمل على النظام يجب ان اضعه في dll ، هذا ما فهمته !! ارجو التوضيح والتصحيح اذا كنت على خطأ ..

لكن ما معنى هذا (من MSDN) ..

Note  You should use global hooks only for debugging purposes; otherwise, you should avoid them. Global hooks hurt system performance and cause conflicts with other applications that implement the same type of global hook

ارجو ممن لديه أي معلومات عن hook او أي مصادر (غير ال msdn) ان لا يبخل بها علينا ..

جزاكم الله كل خير ..

و اعذروني على اسئلتي الكثيرة (البدائية ) ..

بس ا الموضوع مهم لي جدا ..

و بصراحة ما لي غيركم بعد الله ..

(للعلم حاولت وضع السؤال في قسم ال api لكن لم يمكنني ذلك .. لماذا ؟؟ )

و السلام عليكم ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم ..

اسف جدا على الكود الذي في الاعلى ،

محاولات فاشلة !!

المهم ،،

كما يقول دائما اخونا cipher ، لن تفتهم كل شيء من اول مرة .. وفي كل مرة تقرء تكتشف شيء جديد ..

السؤال من جديد !!!

اولا ، هذا الجزء الخاص ب MouseProc كما ورد في ال msdn

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
	CHAR szBuf[128]; 
	CHAR szMsg[16]; 
	HDC hdc; 
	static int c = 0; 

	int cch; 

	if (nCode < 0)  // do not process the message 
		return CallNextHookEx(myhookdata[MOUSE].hhook, nCode, 
			wParam, lParam); 

	// Call an application-defined function that converts a message 
	// constant to a string and copies it to a buffer. 

	LookUpTheMessage((PMSG) lParam, szMsg); 

	hdc = GetDC(hwndMain); 
	cch = wsprintf(szBuf, 
		"MOUSE - nCode: %d, msg: %s, x: %d, y: %d, %d times   ", 
		nCode, szMsg, LOWORD(lParam), HIWORD(lParam), c++); 

	TextOut(hdc, 2, 95, szBuf, cch); 
	ReleaseDC(hwndMain, hdc); 
	return CallNextHookEx(myhookdata[MOUSE].hhook, nCode, wParam, 
		lParam); 
}

و هذا ال WndProc

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

static BOOL afHooks[2];
int index;
static HMENU hmenu;


	switch(message)
   {

	case WM_CREATE: 

		hmenu=GetMenu(hwnd);

		myhookdata[0].nType = WH_MOUSE; 
			myhookdata[0].hkprc = MouseProc; 
		myhookdata[1].nType = WH_KEYBOARD; 
			myhookdata[1].hkprc = KeyboardProc;

		memset(atHooks,FALSE,sizeof(atHooks));

		return 0;


			//break;

	case WM_COMMAND:


		switch ( LOWORD (wParam))
		{
			case ID_APP_EXIT :

				DestroyWindow(hwnd);
				break;


			case ID_HOOK_MOUSE:

			case ID_HOOK_KEYBOARD:

				index=LOWORD(wParam);
				if(!afHooks[index])
					{
					myhookdata[index].hhook = SetWindowsHookEx( 
							myhookdata[index].nType, 
							myhookdata[index].hkprc, 
							(HINSTANCE) NULL, GetCurrentThreadId());


					CheckMenuItem(hmenu, index, MF_BYCOMMAND |
					MF_CHECKED);

					afHooks[index]= TRUE;

						}
				 else
				 {	 UnhookWindowsHookEx(myhookdata[index].hhook); 

						CheckMenuItem(hmenu, index, MF_BYCOMMAND |
						MF_CHECKED);

						afHooks[index]= FALSE; }
			  default: 
				  return DefWindowProc (hwnd, message, wParam, lParam);

		}

		break;


		case WM_RBUTTONDOWN:

				MessageBox(hwnd,"You clicked R B M :) " ,"Hook",0);  
				break;

		case WM_DESTROY:
		case WM_CLOSE :
			  PostQuitMessage (0);
			break;

		}
		return DefWindowProc (hwnd, message, wParam, lParam);
}

المهم ..

الكود الذي في الاعلى لم يتنفذ بسبب وجود الدالة LookUpTheMessage ،

انا الذي اريده ببساطة الاتي :

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 


if( ??? == WM_RBUTTONDOWN)
R++;

if( ??? == WM_LBUTTONDOWN)
L++;

}

اضع عداد لرسائل الزر الايمن والايسر ،

اولا ، اين ستكون هذن الرسائل ، يعني ما الذي سأضع بدل علامات الاستفهام (؟؟؟)

ثانيا ،

انا بس حابب اعرف المفهوم الاساسي ،

يعني الان عند التنفيذ ،

ستكون هناك قائمة تحوي على خيارين (الماوس ، الكيبورد ، اضافة الى زر الخروج )

عندما نضغط على خيار ماوس ،

اريد ان اعرف ما الذي سيحث ،

يعني حسب البرنامج ،

سيتم تنفيذ دالة SetWindowsHookEx ، تمام ؟

الان ، ما الذي سيحصل ؟

سيتم استدعاء MouseProc ، و الذي بداخلها اضع الكود الذي اريد ، مضبوط ؟

الان .. انا مش فاهم !!

ماذا ستفعل ال MouseProc ، هل ستنفذ ما بداخلها وتعود الى WndProc ، والا ماذا ؟

اذا هكذا ، طيب كيف ستراقب الماوس ؟؟

لا ادري اذا كان كلا مي واضح والا لا ،

بصيغة سهلة ،

ال MouseProc متى ستتنفذ ؟ ومتى ستتوقف ؟

اقصد اذا تنفذت ما الذي ستعمله ؟؟

أعتذر على كثرة الاسئلة ،

طبعا ،، تبقى الاسئلة السابقة مطروحة ...

شي اخير مالو علاقة بالهوك ،،

كيف انفذ step by step (اكيد سؤال غبي !!!!)

استخدم F10 , F11

لكن سيكون الكود ب اسمبلي .. ما الحل ؟؟

( هو مفيش حد معبرني ؟؟ )

و السلام عليكم ..

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 9 أغسطس 2006 في 10:03

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#3

هل تريد حذف كل الرد الاول .. او جزئية معينة .. تستطيع تحرير مشاركتك اذا كنت فقط تريد حذف جزئية معينة .

اقتباس
هو مفيش حد معبرني ؟؟

تحتاج تنظر اسبوع اخر ايضا .. تعرف ... مشاغل واختبارات .. وعطلة .. واعراس ... ومشاكل الحروب ..ووو.

سأبحث عن حل لما تريد.

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

انا اقصد الكود الطويل في مشاركتي الاولى ..

اقتباس
ومشاكل الحروب

لو على هذه .. فنحن اكثر من نعاني ..

في اليوم الماضيين ام استطع ان اتي الى المقهى بسبب حظر التجول و تدهور الوضع الامني ..

واكيد ما اقدر اسحب خط انترنيت الى المنزل .. لاسباب امنية ايضا ..

الله يفرج عنا وعن امة محمد (صلى الله عليه وسلم )

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#5

جرب هذا

PMSG MyMessage;
...
MyMessage=PMSG(lParam);

اقتباس
شي اخير مالو علاقة بالهوك ،،

كيف انفذ step by step (اكيد سؤال غبي !!!!)

استخدم F10 , F11

لكن سيكون الكود ب اسمبلي .. ما الحل ؟؟

استخدم هذه الطريقة وبها قد تفهم الاجابة على بعض اسئلتك.

عرف دالة يتم فيها اخراج نص الى ملف txt (تأكد من وجوده) وقم باستدعاءها في اماكن مختلفة وستفهم ترتيب الخطوات ..

حاول انك ما تستعملها كثيراً حتى لا يصبح حجم الملف كبيراً ..

ملحوظة لا تستخدم MessageBox كبديل فتسبب كوراث ...

طبعاً هناك من يستعمل DebugOutPutString او TRACE ...

لنا رجعة للموضوع

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#6

السلام عليكم ورحمة الله ،

شكرا اخي الكريم على المرور ،

بالنسبة للكود ،

انا جربته بهذا الشكل ،،

PMSG msg = (PMSG)lParam;

if(msg->message == WM_RBUTTONDOWN )

TextOut(hdc,200 ,300 ,"you pressed R button here",25);

if(msg->message == WM_LBUTTONDOWN )
TextOut(hdc,msg->pt .x ,msg->pt .y ,"you pressed L button here" ,25);

هل هذا صحيح ،

المشكلة لم يتنفذ ،،

يعني لو احذف جملة ال if ستتنفذ دالة ال textout (اعطيت قيم x ,y مباشرة )،

هناك مشكلة في msg

ولو حذفت ثاني if (أي التي تقارن مع الزر الايسر ) لا يطبع نص على النافذة ، اعتقد لأن قيم x ,y غير صحيحة ، لماذا ؟

اليست العملية صحيحة ؟؟؟

----

بخصوص بقية الاسئلة ، وجدت الاجابة على كثير من تساؤلاتي بعد البحث والقراءة ولله الحمد على ذلك ،

اتمنى من جميع الاعضاء الذين لديهم معلومات ان يفيدونا ،

اقتباس
لنا رجعة للموضوع

اخي cipher ، عن جد ..

اسألك المساعدة ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#7

أخي العزيز ضع مثال الكود(exe+dll) الذي قمت به هنا , وبعد ذلك سيكون النقاش عليه فلا أعلم كيف قمت بكتابة الكود .

اقتباس
ولو حذفت ثاني if (أي التي تقارن مع الزر الايسر ) لا يطبع نص على النافذة ، اعتقد لأن قيم x ,y غير صحيحة ، لماذا ؟

ضع المثال حتى أتأكد من هذه المشكلة .. ربما لها علاقة بـ client coordinate & screen coordinate ..

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#8

السلام عليكم ..

مشكور اخي الكريم على هذا التعاون بارك الله فيك ..

اقتباس
الكود(exe+dll) الذي قمت به

لكني لم اعمل ملف dll ، حسب ما قرأت اذا كان الهوك على ثريد واحد لا يحتاج ،

وانا كل ما عملته محاولة بسيطة جدا جدا لفهم عمل الهوك ..

طبعا اخي الكريم نفذت الطريقة التي اخبرتني اياها وقمت بعمل ملف نصي في بعض الاماكن لمحاولة الفهم ،

if(msg->message == WM_RBUTTONDOWN )

TextOut(hdc,200 ,300 ,"you pressed R button here",25);

حاولت تكوين ملف و الكتابة به هنا ، فلم يتكون ، يعني ان الشرط لم يتحقق ،،

هذا الكود كاملا ..

طبعا هو مأخوذ من msdn (ممكن انت قد اطلعت عليه) لكن هو اخذ 6 انواع من hooks وانا اكتفيت بنوع واحد ،، لكن مفيش فايدة !!

 
#include <windows.h>
#include"resource.h"


typedef struct _MYHOOKDATA 
{ 
	int nType; 
	HOOKPROC hkprc; 
	HHOOK hhook; 
} MYHOOKDATA; 

MYHOOKDATA myhookdata[2];


HWND hwnd;

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);


LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 

{ 


	HDC hdc;
hdc=GetDC(hwnd);


if(nCode < 0)
	  { 
	   CallNextHookEx(myhookdata[0].hhook, nCode,
				   wParam, lParam);
	   return 0;
	  }
 PMSG msg = (PMSG)lParam;


//if(msg->message == WM_RBUTTONDOWN )

TextOut(hdc,200 ,300 ,"you pressed R button here",25);

if(msg->message == WM_LBUTTONDOWN )
TextOut(hdc,msg->pt .x ,msg->pt .y ,"you pressed L button here" ,25);



ReleaseDC(hwnd , hdc);

//	MessageBox(hwnd,"you press R button Mouse .. ","  ",MB_OK);

return CallNextHookEx(myhookdata[0].hhook, nCode, 
					   wParam, lParam);

}

/*
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
if(nCode==0x31)
	MessageBox(hwnd,"you press R button Mouse .. ","  ",MB_OK);

		return CallNextHookEx(myhookdata[0].hhook, nCode, wParam, 
		lParam); 


}
*/

int WINAPI WinMain(HINSTANCE hInstance  , HINSTANCE  ,	LPSTR  , int  )
{


	WNDCLASS   wc;
	MSG msg;

 	wc.style		 = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
 	wc.hIcon		 = (HICON)LoadIcon(hInstance, 0);
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(255,255,255));
	wc.lpszMenuName  =   MAKEINTRESOURCE(IDR_MENU1);
	wc.lpszClassName = "class";

	 RegisterClass(&wc);

	  HWND hwnd = CreateWindowEx(WS_EX_RIGHT|WS_EX_RTLREADING,
					"class",
					0,
					WS_OVERLAPPEDWINDOW,
					100,100, 600, 400,
					NULL, NULL, hInstance, NULL);

	  ShowWindow(hwnd, 1);


	  while(GetMessage(&msg,NULL,0,0)>0)
	{

		TranslateMessage(&msg);


		DispatchMessage(&msg);

	}




 	return msg.wParam;
}












LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

static BOOL atHooks[2];
int index;
static HMENU hmenu;


	switch(message)
   {

	case WM_CREATE: 

		hmenu=GetMenu(hwnd);

		myhookdata[0].nType = WH_MOUSE; 
			myhookdata[0].hkprc = MouseProc; 
	//	myhookdata[1].nType = WH_KEYBOARD; 
		  //  myhookdata[1].hkprc = KeyboardProc;

	//	memset(atHooks,FALSE,sizeof(atHooks));

		//return 0;

			atHooks[0]=FALSE;
			break;

	case WM_COMMAND:


		switch ( LOWORD (wParam))
		{
			case ID_FILE_EXIT_ :

				DestroyWindow(hwnd);
				break;


			case ID_HOOK_MOUSE:

		//	case ID_HOOK_KEYBOARD:

			//	index=LOWORD(wParam);
				if(!atHooks[0])
					{
					myhookdata[0].hhook = SetWindowsHookEx( 
							myhookdata[0].nType, 
							myhookdata[0].hkprc, 
							(HINSTANCE) NULL, GetCurrentThreadId());


					CheckMenuItem(hmenu, 0, MF_BYCOMMAND |
					MF_CHECKED);

					atHooks[0]= TRUE;

						}
				 else
				 {	 UnhookWindowsHookEx(myhookdata[0].hhook); 

						CheckMenuItem(hmenu, 0, MF_BYCOMMAND |
						MF_CHECKED);

						atHooks[0]= FALSE; }
			  default: 
				  return DefWindowProc (hwnd, message, wParam, lParam);

		}

		break;


		case WM_RBUTTONDOWN:

				MessageBox(hwnd,"You clicked R B M :) " ,"Hook",0);  
				break;

		case WM_DESTROY:
		case WM_CLOSE :
			  PostQuitMessage (0);
			break;

		}
		return DefWindowProc (hwnd, message, wParam, lParam);
}

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#9

اذا كان الكود مش واضح ..

سأرفق البرنامج كاملا في مشاركتي الفادمة بأذن الله

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#10

السلام عليكم

المعذرة عن الخطأ الذي حدث ,انت عامل mouse hook وانا لم أنتبه لذلك ...

لاحظ ما كتب في MSDN

WH_MOUSE	Installs a hook procedure that monitors mouse messages. For more information, see the MouseProc hook procedure.

ثم بالنظر الى شرح MouseProc ستجد أن

اقتباس
lParam

Points to a MOUSEHOOKSTRUCT structure.

وبالنظر إلى تعريف MOUSEHOOKSTRUCT

typedef struct tagMOUSEHOOKSTRUCT { // ms  
	POINT pt; 
	HWND  hwnd; 
	UINT  wHitTestCode; 
	DWORD dwExtraInfo; 
} MOUSEHOOKSTRUCT;

هنا لن نستخدم ما أشرت إليه مسبقاً

PMSG msg = (PMSG)lParam;

والذي يمكن إستعماله عند اختيار WH_GETMESSAGE أو WH_MSGFILTER ...

بل سنستخدم MOUSEHOOKSTRUCT ..

هناك أيضاً خطأ بسيط في الكود الذي وضعته

hdc=GetDC(hwnd);

هنا hwnd هي المتغير العام المعرف بـ

HWND hwnd;

بينما مقبض نافذة البرنامج انت قمت بتعريف متغير داخلي آخر لها

HWND hwnd = CreateWindowEx(WS_EX_RIGHT|WS_EX_RTLREADING,
					"class",
					0,
					WS_OVERLAPPEDWINDOW,
					100,100, 600, 400,
					NULL, NULL, hInstance, NULL);

تم تعديل هذه المشاركة بواسطة cipher في 14 أغسطس 2006 في 16:25

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#11

إضافة :

إن كنت تريد التحكم بالرسائل (بما في ذلك رسائل الماوس) المرسلة لنافذتك قبل وصولها فاختر WH_CALLWNDPROC

لاحظ MSDN

H_CALLWNDPROC	Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook procedure.

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#13
اقتباس
اقرأ هذا المقال Hooks and DLLs

أشرت إلى ذلك في ردي

والمقال السابق يستخدم WH_GETMESSAGE

hook = SetWindowsHookEx(
						   WH_GETMESSAGE,
						   (HOOKPROC)msghook,
						   hInstance,
						   0);

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#14

السلام عليكم ،،

جزاك الله خيرا اخي الكريم على هذا التواصل ،

و مشكور اخ Asm4all على المرور ..

اخي cipher

بصراحة انا كنت مقرر اسألك في الطريقة التي وضعتها مسبقا لأني كنت قد قرأتُ ما اشرتَ اليه من ال msdn ،

لدي كم استفسار .. ارجو ان يتسع صدرك لي ولأسئلتي ،،

اقتباس
إضافة :

إن كنت تريد التحكم بالرسائل (بما في ذلك رسائل الماوس) المرسلة لنافذتك قبل وصولها فاختر WH_CALLWNDPROC

هذا ما اريده بالضبط ،

حسنا سأستخدم هذا ،،

لم انتبه الى طريقة عمل الهوك على الماوس

The WH_MOUSE hook enables you to monitor mouse messages about to be returned by the GetMessage or PeekMessage function.

، بالنسبة ل CallWndProc

lParam 
[in] Pointer to a CWPSTRUCT structure that contains details about the message.

وايضا ..

typedef struct tagCWPSTRUCT { 
	LPARAM  lParam; 
	WPARAM  wParam; 
	UINT	message; 
	HWND	hwnd; 
} CWPSTRUCT, *PCWPSTRUCT;

يعني هنا استطيع ان استخدم الطريقة التي اشرت انت اليها في البداية ،

PMSG MyMessage;
...
MyMessage=PMSG(lParam);

يعني سيكون الكود الخاص بهذا كالأتي :

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 

{
………
PMSG msg = (PMSG)lParam;
 if (msg->message==WM_RBUTTONDOWN)
	   MessageBox(NULL,"You clicked R B M from hook  " ,"Hook",0);
if (msg->message==WM_LBUTTONDOWN) 
		  MessageBox(hwnd,"You clicked L B M from hook  " ,"Hook",0);
………..
………..

اخي الكريم ، هل هذا صحيح ؟؟

نفس المشكلة السابقة ،

يعني لا يظهر شيء ، يستدعي دالة CallWndProc لكن لا تتحقق الشروط ،

شي ثاني ،

انا حابب افهم ،

الان على فرض ان الهوك نجح واستلمت الرسالة وتم تنفيذ جملة ال MessageBox ،

ماذا سيحدث بعدها ،

يعني هل ستعود الرسالة الى ال WndProc لتعالج كما اريد لها ، ام انها لا تعود ؟؟؟؟

اقتباس
هناك أيضاً خطأ بسيط

شكرا على التوضيح ..

اقتباس
اقرأ هذا المقال Hooks and DLLs

شكرا اخي الكريم ،

انا كنت قد قرأت هذه المقالة وحملت جميع ما في ذاك الموقع من مقالات عن الهوك وما في منتدانا ايضا ،

لكن هناك الكثير منها متقدمة وانا لسه في اول الطريق وانا حابب امشي خطوة خطوة ،

يعني اولا حابب انفذ احد انواع الهوك بصورة عادية ثم بعد ذلك احاول وضعه في dll ، وسيكون سهل حينها تطبيق بقية الانواع ، وبعد التمكن من هذا انوي الانتقال الى api hook ، شوي .. شوي ..

جزاكم الله كل خير على التعاون الذي ارجو ان يستمر ،

يبدو ان اول خطوة هي اصعب نقطة :wacko:

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#15

السلام عليكم ورحمة الله وبركاته ،

الحمد لله ،، حصل هناك تقدم وانحلت بعض المشاكل ،

اشكرك اخي cipher من اعماق قلبي ،

فيكفيني تواصلك ،

اليك اخي ما حدث معي والمشاكل الجديدة التي ظهرت لي *-)

اولا لقد قمت بتغير نوع الهوك الى

WH_MOUSE_LL Hook

و اصبحت دالة المعالجة

LowLevelMouseProc

هذه الدالة واضحة جدا وتحديدا اقصد ،

wParam 
[in] Specifies the identifier of the mouse message. This parameter can be one of the following messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, or WM_RBUTTONUP.

هذا حل لي بعض المشاكل ،

لكن ،

اول مشكلة ظهرت لي ، وهو انه لا يتم التعرف على

WH_MOUSE_LL

يظهر error

'WH_MOUSE_LL' : undeclared identifier

المهم ، لقد ابقيت النوع القديم ، أي

WH_MOUSE

و غيرت اسم دالة المعالجة فقط ، والغريب انها صارت ،

يعني صار كالأتي :

	hhook = SetWindowsHookEx( 
					WH_MOUSE, 
							LowLevelMouseProc, 
							(HINSTANCE) NULL, GetCurrentThreadId());

بقي الان شيء ،

قريب من المشكلة السابقة ،

كيف احصل على الاحداثيات (اقصد x,y)

عن طريق ال lParam ، تمام ؟؟

lParam 
[in] Pointer to an MSLLHOOKSTRUCT structure. 


MSLLHOOKSTRUCT
The MSLLHOOKSTRUCT structure contains information about a low-level keyboard input event. 
typedef struct tagMSLLHOOKSTRUCT {
  POINT	 pt;
  DWORD	 mouseData;
  DWORD	 flags;
  DWORD	 time;
  ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT;

حاولت بنفس الطريقة السابقة التي اعطيتني اياها ولكن مفيش فايدة ،

،

شيء ثاني ،

كيف اوقف عمل الماوس من داخل دالة الهوك ؛

اذا وضعت متغير يتحكم المستخدم بقيمته وعلى اساسة يتم تنفيذ دالة CallNextHookEx

هذه الدالة اذا لم تتنفذ يتوقف عمل الماوس ، هل هذه الطريقة صحيحة ؟؟

كالأتي

if(flag !=1)
 return CallNextHookEx(hhook, nCode, 
					   wParam, lParam);

،،

شي اخر ،

الرنامج الان المفروض يعمل على الماوس واضفت ايضا الكيبورد ،

لكن هناك مشكلة مع الكيبورد ،

الكود التالي ،

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 

	if(wParam== WM_KEYUP )
		SetDlgItemText(hwnd ,IDC_DISPLAY,"you pressed … ");

هذا الشرط لا يتحقق ابدا ، لماذا ؟؟

بالرغم من ان ال msdn يقول :

wParam 
[in] Specifies the identifier of the keyboard message. This parameter can be one of the following messages: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.

وايضا ،

كيف اعرف ما هو الزر الذي ضغط ؟؟

lParam 
[in] Pointer to a KBDLLHOOKSTRUCT structure

The KBDLLHOOKSTRUCT structure contains information about a low-level keyboard input event. 
typedef struct tagKBDLLHOOKSTRUCT {
	DWORD	 vkCode;
	DWORD	 scanCode;
	DWORD	 flags;
	DWORD	 time;
	ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
Members
vkCode 
Specifies a virtual-key code. The code must be a value in the range 1 to 254.

كيف استخلص هذه القيمة من ال lParam ؟؟

عذبتني هذه المشكلة <_<

اخ cipher هل من الممكن ان ابعث البرنامج على ايميلك الخاص لتطلع عليه ،

ابقى ممتن لك ،

و بارك الله فيك اخي الكريم ،

(وين هل غيبة ،، ان شا الله خير )

-اتمنى من بقية الاعضاء المرور-

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 20 أغسطس 2006 في 10:17

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#16

السلام عليكم ،

الحمد لله انحلت مشكلة اخرى ،

مشكلة الاحداثيات ،

ولكن هناك امر غريب ،،

انا استخدم دالة LowLevelMouseProc والتي بيها lParam كالأتي :

lParam 
[in] Pointer to an MSLLHOOKSTRUCT structure.

الغريب عند استخدام هذا الstruct ، لا يتم التعرف عليه ، يظهر error

Undeclared Identifier

غيرت الطريقة كأني اتعامل مع MouseProc والتي بيها lParam كالأتي :

lParam 
[in] Pointer to a MOUSEHOOKSTRUCT structure.

و ايضا العجيب انها صارت واتت الاحداثيات ،

كالأتي :

	PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;

:wacko: :wacko: :wacko:

احس انني اصبحت كالمجنون .. احدث نفسي !!!

:s :s :s

اقتباس
في هذه المواضيع لن يفيدك سوى أنت ... فقط عليك المزيد من القراءة والمثابرة و التطبيق ( في البداية في اليوم الواحد اذا الكمبيوتر لم تحدث له 10 مرات اعادة تشغيل أو system crash فإنك لم تكن جاداً ...).

كنت اعمل على الحاسبة على برنامجي هذا واحاول ان اجيب عن تساؤلاتي التي لم يجبني احد عليها :D وفجأة توقفت الحاسبة (لا حس ولا نفس ) ، مما اضطرني الى عمل restart (بالقوة) ، ولكن عندما عادت الى العمل تفاجأت ان البارتشن الذي كان يحوي على البرنامج اصبح به خلل فلا يمكن الوصول اليه ويطالب بعمل فورمات اذا حاولت فتح هذا البارتشن ,,, مصيبة .. جميع برامجي والشغل في هذا البارتشن .. والان ودع ،، لا حول ولا قوة الا بالله ، الان اذا اظهر خصائص هذا البارتشن يظهر ان النسبة الفارغة به هي 0 والنسبة المشغولة هي 0 ، ونوع البيانات اصبح RAW !! ماهذا ؟؟؟

حينها تذكرت الاقتباس الذي في الاعلى للأخ cipher ، رغم اني متأكد ان ما حصل ليس له علاقة بالبرنامج فالبرنامج بسيط وما يخوف :lol: ،،

ولكن ,, قدر الله وما شاء فعل ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#17
الاخير زمانه كتب:
السلام عليكم ،

الحمد لله انحلت مشكلة اخرى ،

مشكلة الاحداثيات ،

ولكن هناك امر غريب ،،

انا استخدم دالة LowLevelMouseProc والتي بيها lParam كالأتي :

lParam 
[in] Pointer to an MSLLHOOKSTRUCT structure.

الغريب عند استخدام هذا الstruct ، لا يتم التعرف عليه ، يظهر error

Undeclared Identifier

غيرت الطريقة كأني اتعامل مع MouseProc والتي بيها lParam كالأتي :

lParam 
[in] Pointer to a MOUSEHOOKSTRUCT structure.

و ايضا العجيب انها صارت واتت الاحداثيات ،

كالأتي :

	PMOUSEHOOKSTRUCT hok=(PMOUSEHOOKSTRUCT) lParam;

:wacko: :wacko: :wacko:

احس انني اصبحت كالمجنون .. احدث نفسي !!!

:s :s :s

لا يوجد أي شيء غريب في الموضوع , أنت تستخدم الهوك للرسالة WH_MOUSE , والتي بدورها تستدعي دالة (مهما اطلقت عليها من أسماء) MouseProc , فانت حين غيرت اسمها الى LowLevelMouseProc لن تفرق مع الدالة SetWindowsHookEx التي تطلب فقط مؤشر للدالة MouseProc ولا تشتطرت أن يكون اسمها هكذا

اذا الان تستخدم MouseProc وليس LowLevelMouseProc

اذا التعريف الصحيح يكون كما كان سابقا

 

hhook = SetWindowsHookEx( 
					WH_MOUSE, 
							MouseProc, 
							(HINSTANCE) NULL, GetCurrentThreadId());

بالنسبة لـ WH_MOUSE_LL , قم بتعريفها بهذه الطريقة

#define WH_MOUSE_LL 14

و MSLLHOOKSTRUCT تعريفها هكذا :

 

typedef struct {
	POINT pt;
	DWORD mouseData;
	DWORD flags;
	DWORD time;
	ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;

أعتقد أنك تستخدم VS.NET , لأنه لا يدعم Low Level Hook

يمكن أن تجرب هذه الطريقة أيضا

 

hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, (HINSTANCE) NULL, GetCurrentThreadId());

 

static LRESULT CALLBACK GetMsgProc(UINT code, WPARAM wParam, LPARAM lParam) {
  if(code >= 0) {
	PMSG msg = (PMSG)lParam;
	if (msg->message == WM_LBUTTONDOWN)
	  MessageBoxA(NULL, "WM_LBUTTONDOWN", "Hook", MB_OK);
	else if (msg->message == WM_RBUTTONDOWN)
	  MessageBoxA(NULL, "WM_RBUTTONDOWN", "Hook", MB_OK);
	  //PostMessage(hMyWnd, UWM_MOUSEHOOK, (WPARAM)msg->message, (LPARAM)msg->pt);
  }
  return CallNextHookEx(hHook, code, wParam, lParam);
}

والاحداثيات موجودة في msg->pt

والسلام عليكم ورحمة الله وبركاته

#18

السلام عليكم ..

الحمد لله هناك من اجاب ..

اشكرك اخي Asm4all

اقتباس
أنت تستخدم الهوك للرسالة WH_MOUSE , والتي بدورها تستدعي دالة (مهما اطلقت عليها من أسماء)

كيف هذا ؟؟

هذا ما كنت حابب اسأل عنه ،

ففي المقالة التي وضعت رابطها في ردك السابق ، الكاتب لم يتقيد بأسم الدالة ووضع غير اسم ،

انا كنت اظن ان الاسم لازم يكون هو نفسه كما ورد في ال msdn ،

سأحاول ان اطبق ما كتبت ان شاء الله .

اقتباس
أعتقد أنك تستخدم VS.NET , لأنه لا يدعم Low Level Hook

انا استخدم VC 6 ،

هل هناك اي اشكال ؟

*******

الان انا احاول ان اقرء نوع اخر من الهوك وهو WH_SHELL ،

WH_SHELL Hook
A shell application can use the WH_SHELL hook to receive important notifications. The system calls a WH_SHELL hook procedure when the shell application is about to be activated and when a top-level window is created or destroyed

انا بصراحة لا افهم يمكن لأنني لا أعرف ما المقصود ب shell application :(

ممكن توضيح ؟؟

المهم ،

الان اريد ان اخطي طوة الى الامام ،،

سأقوم بعمل dll ، أي سأحول برنامجي الى global ،

طبعا تواجهني بعض المشاكل ، مثلا شيء كهذا

#pragma data_seg(".JOE")
HANDLE hWnd = NULL;
#pragma dta_seg()
#pragma comment(linker, "/section:.JOE,rws")

او هذا

#define UWM_MOUSEHOOK_MSG \
	_T("UMW_MOUSEHOOK-" \
		"{B30856F0-D3DD-11d4-A00B-006067718D04}")

هو الذي لا افهمه الان ،

سأحاول ان اقرء وابحث ,,,

ولنا عودة

اتمنى ممن لديه معلومات .. و شوية وقت ان يفيدنا و يعلمنا مما علمه الله ،

جزاك الله خيرا اخي على المرور ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#19

السلام عليكم ورحمة الله وبركاته

اقتباس
كيف هذا ؟؟

هذا ما كنت حابب اسأل عنه ،

ففي المقالة التي وضعت رابطها في ردك السابق ، الكاتب لم يتقيد بأسم الدالة ووضع غير اسم

في السي لا تتقيد بانشاء دالة باسم معين غير دالة الـ main , وفي السي++ ضيف عليها دوال البناء والهدم للكلاس

غير هذا يمكنك كتابة أي اسم لأي دالة دون أي قيود لأنك في النهاية تستخدم عنوان الدالة وليس اسمها

اقتباس
انا استخدم VC 6 ،

هل هناك اي اشكال ؟

لا يوجد اشكال , بالعكس كنت أظن أن ال VC 6 يحتوي الـ defines الخاصة بالـ LL Hook, لأني أستخدم vs.net أيضا ولا توجد أي تصريحات خاصة بال LL Hook
اقتباس
الان انا احاول ان اقرء نوع اخر من الهوك وهو WH_SHELL ،

.....

انا بصراحة لا افهم يمكن لأنني لا أعرف ما المقصود ب shell application :(

ممكن توضيح ؟؟

صراحة لم اتعامل مطلقا مع هذا النوع من الـ hook, ولم أقرأ عنه حتى

#pragma data_seg(".JOE")
HANDLE hWnd = NULL;
#pragma dta_seg()
#pragma comment(linker, "/section:.JOE,rws")

هذا الكود يقوم بحجز منطقة مشتركة shared بين جميع النسخ instance التي يتم انشائها من الdll عند تشغيله

لأن كل برنامج عندما يستدعي ملف dll فانه يقوم بحجز مكان للبيانات الخاصة بالـ dll في الـ Address Space الخاص بالبرنامج

ولكن عند عمل منطقة مشتركة shared في ملف الـ dll فعند استدعاء الـ dll لأول مره يقوم بانشاء هذه المنطقة ووضع المتغيرات بداخلها , بعد هذا عند استدعاء الـ dll من أي برنامج آخر فان البرنامج يشير الى نفس المنطقة فتكون مشتركة بين جميع النسخ من الـ dll

لا تنسى أيضا تعديل الكود السابق الى :

#pragma data_seg(".SHARE")
static HWND	  hMyWnd   = NULL;
static HINSTANCE hDllInst = NULL;
static HHOOK	 hHook	= NULL;
#pragma data_seg()

#pragma comment(linker, "/section:.SHARE,rws")

ولا ترتبك فـ JOE = SHARE = HELLO , مجرد اسم للمنطقة

 

#define UWM_MOUSEHOOK_MSG \
	_T("UMW_MOUSEHOOK-" \
		"{B30856F0-D3DD-11d4-A00B-006067718D04}")

في هذا التطبيق نحتاج الى رسالة خاصة بنا لتكون وسيلة تنبيه من الـ dll الى البرنامج ليخبره بحدوث الهوك

لهذا سنقوم بتسجيل رسالة جديدة باستخدام RegisterWindowMessage , والتي تحتاج لنص فريد لعمل رسالة خاصة نضمن الا تتكرر مع برامج اخرى كي لا تتعارض مع وظيفتنا

لهذا يحتاج الى انشاء نص معقد ومضمون الا يتكرر بين جهاز واخر ولا بين مره واخرى , لهذا استخدم اداة GUID الموجودة مع فيجوال ستوديو لتوليد هذا الرقم المعقد , ثم أضاف في أوله اسم الرسالة , بحيث يكون هذا هو النص الخاص بالرسالة

وقام بتعريفه في الهيدر لأنه مشترك بين الـ dll و البرنامج لأنك تحتاج لتسجيل نفس الرسالة في الجانبين

لمعلومات أكثر Message Management:Registered Window Messages

#20

حياك الله اخوي ..

وجزاك الله خيرا على الرد ..

سأقرء ردك بالتفصيل ..

ولي عودة ان شا الله في اقرب فرصة ,,

فقط ارجو منك التواصل بارك الله فيك ..

هل لديك معلومات اخي عن هذا

اقتباس
وتوجد طريقة للتحايل على النظام ؟! بجعل المراقبة شاملة وبدون إستخدام ملف خارجي

تكون دالة المراقبة بهذا الشكل

__declspec(dllexport) LRESULT CALLBACK KeyHook(int code,WPARAM wParam,LPARAM lParam)
{
..
..
}

ونستوردها من داخل البرنامج وكأنها من ملف dll خارجي

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#22

السلام عليكم ..

اقتباس
لو حد رد عليا هنا هاقولك ما تقلقش

وما الحل ؟؟!! :^)

-------------

الان انا بدأت اكتب في ال dll ، وبما انه اول مرة لازم راح تواجهني مشاكل ،

لدي المشاكل التالية في بناء ال dll نفسه ،

الخطوات التي قمت بها هي ،

كونت مشروع dll وفي الهيدر فايل ، كتبت

define DLL_EXPORT __declspec(dllexport)


DLL_EXPORT void SetMouseHook();
DLL_EXPORT void SetKbHook();
DLL_EXPORT void RemoveHook();

وفي الفايل .c كتبت الbody للدوال

مثلا

DLL_EXPORT	void SetMouseHook(void)
{

	hhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)LowLevelMouseProc, hInst, (DWORD)NULL);  


}

DLL_EXPORT	void SetKbHook()
{

		hhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInst, (DWORD)NULL);  

}

DLL_EXPORT	void RemoveKbHook(void)
{

		UnhookWindowsHookEx(hhook);	
}

ثم كتبت دوال HookProc

وهنا كانت المشكلة !!

مثلا دالة الماوس تحوي الجمل التالية ..

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) 

{
…
…
…
if(wParam== WM_RBUTTONUP )
{
	SetDlgItemText(hWnd ,IDC_DISPLAY,"you pressed Right ");
R++;

SetDlgItemInt(hWnd,IDC_POS_X,hok->pt .x ,TRUE);
SetDlgItemInt(hWnd,IDC_POS_Y,hok->pt .y ,TRUE);

}

…
…
…
}

الان هذه الجملة يظهر عليها الاخطاء التالية:

error C2065: 'hWnd' : undeclared identifier
error C2065: 'IDC_DISPLAY' : undeclared identifier
error C2065: 'IDC_POS_X' : undeclared identifier
error C2065: 'IDC_POS_Y' : undeclared identifier

Error executing cl.exe.

اولا بالنسبة لل hWnd ، انا كنت احصل عليه سابقا (أي عندما كان البرنامج بدون dll)

من هنا

LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

الان من اين احصل عليه ؟؟!!

وبالنسبة لبقية ال IDs هي معرفة ضمن ال resource ، من اين احصل عليها الان ؟؟

هل اضيف ال resource الى ال dll ؟؟

ام احذف هذه الجمل واضعها في البرنامج الذي سيستخدم هذه ال dll ؟؟

ارجو التوضيح بارك الله فيكم ...

اخي Asm4all ،

شكرا على اجاباتك .. جزاك الله كل خير ..

لدي كم استفسار ..

#pragma data_seg(".JOE")
HANDLE hWnd = NULL;
#pragma dta_seg()
#pragma comment(linker, "/section:.JOE,rws")


"]#define UWM_MOUSEHOOK_MSG \
	_T("UMW_MOUSEHOOK-" \
		"{B30856F0-D3DD-11d4-A00B-006067718D04}")

هل هذه الخطوات ضرورية ؟؟

انا كان حملت برنامج من النت ليس به هذه الامور ، وهو ايضا global hook ،

لكن عند تنفيذه يظهر

error in loading dll

يعني هل يجب ان اضيف هذه الخطوات ليعمل ال dll ؟؟

**

اقتباس
لا تنسى أيضا تعديل الكود السابق الى :

#pragma data_seg(".SHARE")
static HWND	  hMyWnd   = NULL;
static HINSTANCE hDllInst = NULL;
static HHOOK	 hHook	= NULL;
#pragma data_seg()

#pragma comment(linker, "/section:.SHARE,rws")

ما معنى هذا ؟؟ ولماذا هذا التعديل ؟

ارجو ان لا تضجر من اسئلتي يا اخي ،،

فأنا مبتدئ ،

اقتباس
لهذا استخدم اداة GUID

أين هذا الاداة بالضبط ؟

هل تقصد _T

وهل هذا هو الرقم المعقد الذي كنت قد تحدثت عنه

"{B30856F0-D3DD-11d4-A00B-006067718D04}"

،،

انا كنت قد اطلعت على المقالة التي وضعت رابطها ولكن على عجالة ،،

الان اتى دورها ،، سأقرءها ،، وسأحاول ان ابحث ،،

ولي عودة بعون الله ..

ارجو منك التوصل ،،

و للأخ cipher ،

ارجو ان يكون انقطاعك خير ...

وجزاكم الله كل خير ،،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#23

السلام عليكم ورحمة الله وبركاته ..

اقتباس
اولا بالنسبة لل hWnd ، انا كنت احصل عليه سابقا (أي عندما كان البرنامج بدون dll)

من هنا

LRESULT CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

الان من اين احصل عليه ؟؟!!

وبالنسبة لبقية ال IDs هي معرفة ضمن ال resource ، من اين احصل عليها الان ؟؟

هل اضيف ال resource الى ال dll ؟؟

ملف الـ dll مستقل ولا يتبع البرنامج الذي يستخدمه ولا يعلم عن بياناته أي شيء , لهذا لا تستطيع التعامل معها بتلك الطريقة, ولكن كل ما في الامر انك ستمرر قابض نافذة البرنامج الذي يستخدم الـ dll الى الـ dll من خلال أحد الدوال لكي يستطيع الـ dll مخاطبة البرنامج
اقتباس
ام احذف هذه الجمل واضعها في البرنامج الذي سيستخدم هذه ال dll ؟؟
بالضبط , كل ما عليك هو ارسالة رسالة من الـ dll الى البرنامج الذي يستخدمه لاعلامه عن حدوث هوك وارسال البيانات التي يحتاجها الى البرنامج

بعد هذا يتعامل البررنامج مع هذه البيانات بالطريقة التي يريدها

كالعادة نقوم بتمرير مقبض النافذة الى الـ dll من خلال دالة الـ SetHook فتكون بصمة الدالة بهذه الطريقة

 BOOL SetHook(HWND hWnd);

عندك مثلا تكون بهذا الشكل

 DLL_EXPORT void SetMouseHook(HWND hWnd);
DLL_EXPORT void SetKbHook(HWND hWnd);

وداخل دالة الـ SetHook تقوم بحفظ المقبض داخل الـ dll لكي تستطيع ارسال رسالة الى البرنامج عن طريق المقبض

اقتباس
 

#pragma data_seg(".JOE")
HANDLE hWnd = NULL;
#pragma dta_seg()
#pragma comment(linker, "/section:.JOE,rws")


#define UWM_MOUSEHOOK_MSG \
	_T("UMW_MOUSEHOOK-" \
		"{B30856F0-D3DD-11d4-A00B-006067718D04}")

هل هذه الخطوات ضرورية ؟؟

انا كان حملت برنامج من النت ليس به هذه الامور ، وهو ايضا global hook ،

لكن عند تنفيذه يظهر

error in loading dll

يعني هل يجب ان اضيف هذه الخطوات ليعمل ال dll ؟؟

بالنسبة لعمل منطقة مشتركة في ضرورية , لحفظ بيانات في جميع الـ Instance الفعالة من الملف الـ dll , راجع المشاركة السابقة

وبالنسبة للرسالة فهي غير ضرورية , يمكنك كتابة نص الرسالة للدالة RegisterWindowMessage مباشرة , أو يمكنك استخدام رسالة ثابته مثل WM_USER+1 مثلا , راجع المقال المشار اليه في المشاركة السابقة

#pragma data_seg(".SHARE")
static HWND	  hMyWnd   = NULL;
static HINSTANCE hDllInst = NULL;
static HHOOK	 hHook	= NULL;
#pragma data_seg()

#pragma comment(linker, "/section:.SHARE,rws")

معنى هذا , انك حجزت منطقة للبيانات مشتركة بين كل النسخ التي تم تحميلها من الـ dll , وتم وضع ثلاث متغيرات في هذه المنطقة , معنى هذا أن أي برنامج يستخدم الـ dll ستكون قيمة هذه البيانات في الـ dll واحدة , اذا يوجد مقبض نافذة واحد , ويوجد مقبض للـ dll واحد , ويوجد مقبض للـ hook واحد

فلو تم استدعاء احد الدوال التي تستخدم هذه البيانات من داخل اي برنامج فسوف يتعامل مع نفس القيم

العلة من كل هذا أن عملية الـ Hook تتم في الـ address space الخاص بالبرنامج المستهدف , ويتم استدعاء الدالة الـ HookProc داخل نفس الـ address space والتي من داخلها سوف نقوم براسال رسالة الى برنامجنا عن طريق مقبض النافذة

فلو كان المقبض بيانات عادية - أي غير مشتركة - فان كل نسخة من الـ dll تحجز بياناتها داخل الـ address space الخاص ببرنامجها وتكون له قيمه الخاصة , وفي هذه الحالة لن نستطيع ارسال الرسالة الى برنامجنا من برنامج اخر , هل وضحت الفكرة ؟

لمعرفة اكثر عن استخدام هذه الفكرة شاهد هذا الرابط http://msdn2.microsoft.com/en-us/library/thfhx4st.aspx

وراجع مره اخرى الموضوع Hooks and DLLs

أما لماذا التعديل ؟؟

حدثت مشاكل اول مرة تعاملت مع الـ hook , وبعد فترة من تتبع تنفيذ البرنامج وجدت أن السبب تغير قيمة hDllInst و تحول القيمة hHook الى NULL , فوجدت ان الحل ان اثبت هذه القيم عن طريق مشاركتها بين الـنسخ

الان احاول تذكر كيف ظهرت لي هذه المشكلة ولكن بلا فائدة , ربما اتذكرها لاحقا , او يقابلني السبب على الانترنت - أكيد لست أول من قابلته هذه المشكلة :D .

اقتباس
أين هذا الاداة بالضبط ؟
الاداة موجودة في فيجوال ستوديو , للوصول لها :

Tools->Create GUID

اقتباس
"{B30856F0-D3DD-11d4-A00B-006067718D04}"

أحد الأرقام التي يتم توليدها من الاداة

والسلام عليكم

#24

عذراً فانا مشغول هذين الأسبوعين بالعمل .

لسه قبل ساعة راجع من سفر وبعد يومين مسافر أيضاً :wacko:

اقتباس
اولا بالنسبة لل hWnd ، انا كنت احصل عليه سابقا (أي عندما كان البرنامج بدون dll)

انت من سيمرر المقبض (ومعلومات أخرى قد تحتاجها) الى DLL . ومن ثم ستقوم بارسال رسالة الى البرنامج الأساسي فيها المعلومات التي حصلت عليها وتريد إظهارها او استخدامها فيه ...راجع اي مثال يعمل global hook

اقتباس
هل هذه الخطوات ضرورية ؟؟

في الفيجوال سي بامكانك إضافة section جديد لعمل منظقة مشتركة يتم فيها تعبئة بيانات او آخذها ..

هناك طريقة أخرى باستعمال Mapping File وهي تستخدم في دلفي لانه لا يمكن -حسب معلوماتي وربما اكون مخطئاً- عمل section جديد.. بامكانك استخدام هذه الطريقة أيضاً ..

عفواً الإجابة على عجالة لاني مشغول بالعمل حالياً ..

قد لا أستطيع هذا الأسبوع المواصلة معكم ...

---

أعتذر للأخ Asm4all فلم أتعمد وضع رد يلي ردك كتعقيب . ربما كنا نكتب الرد في نفس الوقت !

أكرر إعتذاري!

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#25

ولا يهمك أخي cipher , لا توجد اي مشكلة عندي حتى لو كان ردك نفس كلامي بالحرف أو عكسة , ليس عندي هذا النوع من الحساسية ;)

هذا الموضوع مغلق.

مواضيع مشابهة