PDA

View Full Version : hook کردن پیغام های سیستم عامل



majid2230
پنج شنبه 05 آذر 1388, 10:58 صبح
من دارم روی برنامه ای کار می کنم که نیاز به hook کردن پیغام های سیستم عامل از جمله copy,paste,errors,etc دارم من خودم رو به زنجیره اضافه کردم اما نمی دونم دقیقا باید از این به بعد چه کار کنم .لطفا کمککککککککک !!!:گریه:

majid2230
جمعه 06 آذر 1388, 16:45 عصر
خواهش می کنم جواب بدید .کسی بلد نیست خیلی لازم دارم .اساتید کجان ؟

tdkhakpur
جمعه 06 آذر 1388, 17:20 عصر
Hook را جستجو کنید

AliReza Vafakhah
جمعه 06 آذر 1388, 22:35 عصر
Hook را جستجو کنید

خوب شما جستجو کنید تا بقیه هم استفاده کنن !

هر تاپیک این شکلی که به hook ختم میشه دوستان عرض میکنن که hook را جستجو کنید یا از hook استفاده کنید ، خلاصه میرن جاده خاکی

Nima NT
جمعه 06 آذر 1388, 22:43 عصر
شاید این بتونه براتون مفید باشه.

majid2230
شنبه 07 آذر 1388, 04:27 صبح
با تشکر از پاسختون آقای Nima NT (http://www.barnamenevis.org/forum/member.php?u=57986)
ولی مقاله (خوبی)که ارائه کرده بودید خیلی کلی بود و منم یه کاربر سطح پایینم .من تکه کدی رو که نوشتم ضمیمه می کنم .اگه تونستید بهم کمک کنید .با تشکر از تمام کسایی که جواب می دن .:قلب:

vcldeveloper
شنبه 07 آذر 1388, 09:27 صبح
من تکه کدی رو که نوشتم ضمیمه می کنم .اگه تونستید بهم کمک کنید .


function HookProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
Msg : PMessage;
begin
if Code >= 0 then
begin
Msg := Pointer(lParam);
if Msg.Msg = MSGF_DIALOGBOX then
begin
{Process MSGF_DIALOGBOX here}
end;
end;

Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

majid2230
یک شنبه 08 آذر 1388, 04:38 صبح
سلام :
کدی رو که گذاشته بودید امتحان کردم به سه مشکل برخوردم ولی اول این کدی که نوشتم



library D_Message;

uses
SysUtils,
messages,
windows,shellapi,
Classes;

var
HookHandle:thandle;

{$R *.res}

function HookProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
Msg : PMessage;
begin
if Code >= 0 then
begin
Msg := Pointer(lParam);
if Msg.Msg = MSGF_DIALOGBOX then
begin
ShellExecute(GetForegroundWindow,'open','explorer. exe',nil,nil,sw_normal);
end;
end;
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

procedure RunHook; stdcall;
begin
HookHandle:= SetWindowsHookEx(WH_MSGFILTER, @HookProc, HInstance, 0);
if HookHandle = INVALID_HANDLE_VALUE then
begin
MessageBox(0, 'Error :)' , '' , MB_OK);
Exit;
end;
end;

procedure KillHook; stdcall;
begin
if HookHandle <> INVALID_HANDLE_VALUE then
UnhookWindowsHookEx(HookHandle);
end;

exports
KillHook,
RunHook;

begin
end.


1:وقتی یه پیغام مثلا پیغام پاک کردن نشان داده میشه یه مدت طول می کشه تا برنامه بفهمه و اگر تو این مدت دیالوگ رو ببندیم برنامه دیگه اصلا متوجهش نمیشه .
2:explorer من بعد از هر بار اجرای برنامه stop working می ده .
3:من نتونستم چیزی برای گرفتن نوع پیغام پیدا کنم .
منتظر جوابتون هستم . :لبخند:

majid2230
یک شنبه 08 آذر 1388, 16:14 عصر
دوباره بیدار شدم !!!:لبخند:
داشتم رو برنامه کار می کردم یه سوال جدید برام ایجاد شد :خجالت::
مگه با کد بالا ما دیالوگ مسیج ها رو هوک نمی کنیم چرا با هربار کلیک ودابل کلیک و غیره برنامه اجرا می شه .
میشه یه نفر جواب بده لطفا !!!!

tdkhakpur
یک شنبه 08 آذر 1388, 17:27 عصر
چرا اینطوری :لبخند: میکیند.

مگه با کد بالا ما دیالوگ مسیج ها رو هوک نمی کنیم چرا با هربار کلیک ودابل کلیک و غیره برنامه اجرا می شه .

خوب عزیز جان برای اینکه بفهمی چرا این شکلیه? باید بروید و دل و جگر shel را باز کنید و بفهمید که چرا همه پیغامها را دریافت میکند.:لبخندساده:

majid2230
یک شنبه 08 آذر 1388, 18:45 عصر
فکر کنم منظور من رو بد متوجه شدید.
سوال من که چرا با کلیک ,برنامه اجرا می شه در واقع با این مفهوم بود که چرا با وجود این که من دیالوگ مسیج ها رو هوک کردم باز هم برنامه من اجرا می شه مگه کلیک و دابل کلیک هم دیالوگ مسیجه.
دوما چرا نباید بخندم .

vcldeveloper
یک شنبه 08 آذر 1388, 22:42 عصر
شما دایالوگ باکس رو هوک نکردید، بلکه کلا همه پیام های ارسالی توسط سیستم را هوک کردید. در کد شما باید مثل مثال فوق با استفاده از شرط، پیام های مورد نظر خودتان را پردازش کنید، و به سایر پیام ها کاری نداشته باشید.

majid2230
یک شنبه 08 آذر 1388, 23:26 عصر
خوب حالا می رسیم به سوالی که چند تا پست قبل تر مطرح کرده بودم .


3:من نتونستم چیزی برای گرفتن نوع پیغام پیدا کنم .

من هیچ آشنایی با کلاس مسیج ندارم نمودنم باید پیغامها رو با چی فیلتر کنم .در کل پیغامهایی که من می خوام بگیرم موارد زیر هستش :
error in copying file/folder
error in cuting file/folder
error in deleting file/folder
and access denied error

tdkhakpur
دوشنبه 09 آذر 1388, 00:28 صبح
مطالب زیر را مطالعه کنید (راهنمای کامپایلر)


code // مشکل شما اینجاست
Specifies the type of input event that generated the message. This parameter can be one of the following values:
Value Meaning
MSGF_DDEMGR The input event occurred while the Dynamic Data Exchange Management Library (DDEML) was waiting for a synchronous transaction to finish. For more information about DDEML, see Dynamic Data Exchange Management Library.
MSGF_DIALOGBOX The input event occurred in a message box or dialog box.
MSGF_MENU The input event occurred in a menu.
MSGF_NEXTWINDOW The input event occurred as a result of the user's pressing the ALT+TAB key combination to activate a different window.
MSGF_SCROLLBAR The input event occurred in a scroll bar.

If code is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and return the value returned by CallNextHookEx.
wParam
Specifies a NULL value.
lParam// راه حل شما هم اینجا
Points to an MSG structure.

Return Values
If the hook procedure processes the message, the return value must be a nonzero value. Otherwise, it must be zero.

حتما خواهید دانست مشکلتان کجاست.

vcldeveloper
دوشنبه 09 آذر 1388, 01:24 صبح
من هیچ آشنایی با کلاس مسیج ندارم نمودنم باید پیغامها رو با چی فیلتر کنم .
در همان نمونه کدی که گذاشتم، مشخص هست که باید پیام ها را چطور از هم تفکیک کنید. برای TMessage هم کافی بود کلید Ctrl را نگهداری و روی آن کلیک کنید تا تعریف آن را در دلفی ببینید، و متوجه بشید که یک رکورد ساده در دلفی هست، که شناسه پیام، هندل پنجره مقصد پیام، و پارامترهای پیام (lparam, wparam) را در خود نگهداری می کند. شما از روی مقایسه مقدار فیلد Msg آن با شناسه های پیام مورد نظرتان، می تونید متوجه بشید که آیا پیام ارسالی، پیام مورد نظر شما هست یا نه.

در همان کد این کار با استفاده از خط زیر انجام میشه:

if Msg.Msg = MSGF_DIALOGBOX then
یعنی اگر پیام دریافتی MSGF_DIALOGBOX بود، بلوک مربوط به شرط if را اجرا کن. به همین ترتیب می تونید با شرط های مشابه، پیام های مورد نظر خودتان را در صورت ارسال شدند، پردازش کنید.

البته مواردی که شما بهش اشاره کردید:

error in copying file/folder
error in cuting file/folder
error in deleting file/folder
and access denied error
چندان ربطی به پیام های ویندوز ندارند، و بیشتر به مباحث Exception Handling در ویندوز مربوط میشند.

majid2230
دوشنبه 09 آذر 1388, 01:48 صبح
میشه درباره exception handling توضیح بیشتری بدید.
اگر منظورتون try block است به درد من نمی خوره چون داخل خود برنامه کار می کنه ولی من می خوام خطاهای سیستم عامل مثلا در موقع انجام دستور delete توسط کاربر در explorer رو هندل کنم.

majid2230
دوشنبه 09 آذر 1388, 17:47 عصر
کسی جواب نمی ده:عصبانی++:واقعا لازم دارم

vcldeveloper
دوشنبه 09 آذر 1388, 18:01 عصر
اگر منظورتون try block است به درد من نمی خوره چون داخل خود برنامه کار می کنه ولی من می خوام خطاهای سیستم عامل مثلا در موقع انجام دستور delete توسط کاربر در explorer رو هندل کنم.
اون بلوک های try-except در واقع از مکانیزم های ارائه شده توسط سیستم عامل برای مدیریت Exception استفاده می کنند.

http://msdn.microsoft.com/en-us/library/ms680657%28VS.85%29.aspx

حامد مصافی
دوشنبه 09 آذر 1388, 18:43 عصر
شما مي خواهيد هنگامي كه كاربر فايلي را copy يا cut مي كند مطلع شويد؟
گمان نمي كنم اين اعمال توليد پيغام كنند!

majid2230
دوشنبه 09 آذر 1388, 22:35 عصر
من احساس می کنم اگر دلیل نیازم به این کد رو بگم بهتر مشخص می شه که به hook نیاز دارم یا بلوک try :
من برنامه ای برای unlock کردن فایل های مورد استفاده توسط دیگر برنامه ها نوشته ام(یک برنامه هنگام استفاده از یک فایل آن را برای استفاده خودش lock می کند که با عث می شود امکان پاک کردن و cut کردن آن نباشد) من می خوام زمانی که کاربر کامپیوتر با این گونه خطا ها(خطای lock شدن فایل)روبرو شد برنامه من به صورت خودکار فعال بشه .
فکر کنم منظورم رو به خوبی توضیح دادم حالا کدوم رو استفاده کنم؟چگونه؟ممنون که جواب می دید.

majid2230
سه شنبه 10 آذر 1388, 00:35 صبح
من احساس می کنم اگر دلیل نیازم به این کد رو بگم بهتر مشخص می شه که به hook نیاز دارم یا بلوک try :
من برنامه ای برای unlock کردن فایل های مورد استفاده توسط دیگر برنامه ها نوشته ام(یک برنامه هنگام استفاده از یک فایل آن را برای استفاده خودش lock می کند که با عث می شود امکان پاک کردن و cut کردن آن نباشد) من می خوام زمانی که کاربر کامپیوتر با این گونه خطا ها(خطای lock شدن فایل)روبرو شد برنامه من به صورت خودکار فعال بشه .
فکر کنم منظورم رو به خوبی توضیح دادم حالا کدوم رو استفاده کنم؟چگونه؟ممنون که جواب می دید.

hojjatcroos
سه شنبه 10 آذر 1388, 08:34 صبح
سلام دوستان بالاخره این بحث هوک یک تکونی خورد یک سوال از خدمتتون داشتم می خواستم پیغام های ویندوز مثلا WM_MOVE رو هوک کنم ولی کدی که شما نوشتید کمکم نمیکنه آیا مشکل از hooktype هستش؟


var
HookHandle:thandle;
{$R *.res}
function HookProc(Code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
Msg : TMessage;
begin
Msg.LParam:=lParam;
if Code>=0 then
begin
if Msg.Msg =WM_MOVE then
begin
ShellExecute(GetForegroundWindow,'open','c:\window s\explorer.exe',nil,nil,SW_SHOW);
end;
end;
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
procedure RunHook; stdcall;
begin
HookHandle:= SetWindowsHookEx(WH_MSGFILTER, @HookProc, HInstance, 0);
if HookHandle = INVALID_HANDLE_VALUE then
begin
MessageBox(0, 'Error :)' , '' , MB_OK);
Exit;
end;
end;
procedure KillHook; stdcall;
begin
if HookHandle <> INVALID_HANDLE_VALUE then
UnhookWindowsHookEx(HookHandle);
end;

majid2230
سه شنبه 10 آذر 1388, 20:36 عصر
کسی جوابی نداره بده ؟لطفا اگه می دونید جواب بدید ضمنا برای اون دوستم که پست بالا رو گذاشته لازم نیست حتما تو کد بالا explorer رو باز کنید من این کد رو همینجوری انتخاب کردم .

majid2230
پنج شنبه 12 آذر 1388, 01:50 صبح
کسی ایده ای نداره ؟

majid2230
جمعه 13 آذر 1388, 05:08 صبح
از اونجایی که دیگه کسی پاسخی نمی ده The End

FiACKER
شنبه 14 آذر 1388, 15:20 عصر
سلام

من تقریبا فهمیدم چی می خواید.
اما اینکه شما بفهمید که اکسپلورر خطایی مبنی بر قفل بودن فایل مورد نظر داده ، به چه کارتون می یاد !؟
شما می خواید برنامه ای مثله Unlocker بسازید !؟

hojjatcroos
شنبه 14 آذر 1388, 17:11 عصر
سلام خوب خطای قفل شدن فایل به چه شکلی رخ می ده اگه به صورت یک MessagBox هست این تابع رو هوک کن(البته با کامپوننت Madshi) زمانی که این تابع فراخونی شد اطلاعاتش به همون CallBack فرستاده میشه اون ها رو چک کن و دستورات مورد نظرت رو اجرا کن

majid2230
یک شنبه 15 آذر 1388, 03:25 صبح
میشه لینک دانلود این کامپوننت رو برام میل کنید .نتونستم نسخه ریجیستر شده اش رو پیدا کنم.
mat1368@yahoo.com
ضمنا آره من دارم برنامه ای می نویسم که برای یه قسمت از کارش لازمه شبیه unlocker عمل کنه .می تونید راهنمایی کنید.

FiACKER
یک شنبه 15 آذر 1388, 13:20 عصر
میشه لینک دانلود این کامپوننت رو برام میل کنید .نتونستم نسخه ریجیستر شده اش رو پیدا کنم.
mat1368@yahoo.com
ضمنا آره من دارم برنامه ای می نویسم که برای یه قسمت از کارش لازمه شبیه unlocker عمل کنه .می تونید راهنمایی کنید.

ایا می تونید یک فایل رو بررسی کنید و ببینید چه پروسه ای داره رویه اون کار می کنه !؟ و قفلش کرده ؟

majid2230
چهارشنبه 18 آذر 1388, 16:46 عصر
بله ,با کنسول handle.exe شما می تونید برنامه هایی که یک فایل رو قفل کرده بگیرید.
تو نت سرچ کنی پیدا میشه.باید run as admin بشه.
مشکل من هنوز حل نشده کسی جوابی نداره.