السلام عليكم ..
كيف الصحة اخواني ؟؟
لقد دخت السبع دوخات وانا اقرء عن ال 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 لكن لم يمكنني ذلك .. لماذا ؟؟ )
و السلام عليكم ..
