View Full Version : سوال: سوال در مورد KeyBord Hook
fire.angle
یک شنبه 17 بهمن 1389, 22:15 عصر
با سلام
سوال اول :
من یه برنامه هوک به کیبرد رو دارم ( در حالت سراسری در تمام سیستم عامل ) اما وقتی یه کاراکتر زده میشه مثلا a اونوقت wparam برابر 65 میشه که کد اسکی حرف A است و موقعی که A زده میشه همون 65 رو برمیگردونه
چرا کد اسکی حرف a با کد اسکی A هیچ فرقی نمیکنه ؟؟؟؟؟ مگر نه اینکه کد اسکی a=97 و کد اسکی A=65 هست ؟
پس چرا برای هر دو اینها یک کد برمیگردونه ؟؟؟؟ برای سایر کلید ها کد درسته و فقط برای حروف الفبایی چنین اتفاقی می افته
جالب اینه که در صورتی که هوک رو به صورت محلی ( در سطح یک برنامه کاربردی ) بنویسم اونوقت برای a کد اسکی 97 و برای A کد اسکی 65 بر میگردونه
سوال دوم :
فرض کنید شما هوکتون رو فعال کردید . حالا فرض کنید هوکتون رو غیر فعال کردید . حالا میخواید دوباره هوک رو فعال کنید
مشکل اینجاست.... دیگه هوک فعال نمیشه مگر اینکه برنامه رو یه بار ببندید و دوباره باز کنید
علت چیست و چطور میشه حلش کرد ؟؟؟؟؟؟
لطفا راهنمایی کنید.......
hadisalahi2
دوشنبه 18 بهمن 1389, 09:20 صبح
اگه منظورتون از hook همون تعریف Hot Key است پیشنهاد میکنم همین کلمه Hot Key رو در سایت جستجو کنید. چندین تاپیک با توضیحات کامل در این زمینه وجود داره
یا حق
fire.angle
دوشنبه 18 بهمن 1389, 10:17 صبح
نه خیر دوست عزیز. منظور من Hot Key نیست از Hot Key ها برای ایجاد کلید میانبر در برنامه ها استفاده میشه اما از KeyBord Hook معمولا برای نوشتن برنامه های Key logger استفاده میشه
لطفا دوستان راهنمایی کنند .....
Felony
دوشنبه 18 بهمن 1389, 11:20 صبح
من یه برنامه هوک به کیبرد رو دارم ( در حالت سراسری در تمام سیستم عامل ) اما وقتی یه کاراکتر زده میشه مثلا a اونوقت wparam برابر 65 میشه که کد اسکی حرف A است و موقعی که A زده میشه همون 65 رو برمیگردونه
چرا کد اسکی حرف a با کد اسکی A هیچ فرقی نمیکنه ؟؟؟؟؟ مگر نه اینکه کد اسکی a=97 و کد اسکی A=65 هست ؟
پس چرا برای هر دو اینها یک کد برمیگردونه ؟؟؟؟ برای سایر کلید ها کد درسته و فقط برای حروف الفبایی چنین اتفاقی می افته
برای اینکه پیغام WM_KeyDown رو هوک کرده ، تا جایی که یادمه باید پیغام WM_Char رو هوک کنید .
فرض کنید شما هوکتون رو فعال کردید . حالا فرض کنید هوکتون رو غیر فعال کردید . حالا میخواید دوباره هوک رو فعال کنید
مشکل اینجاست.... دیگه هوک فعال نمیشه مگر اینکه برنامه رو یه بار ببندید و دوباره باز کنید
باید دید تو کدتن چی کار کردید ، کد رو قرار بدید .
tdkhakpur
دوشنبه 18 بهمن 1389, 12:05 عصر
چرا کد اسکی حرف a با کد اسکی A هیچ فرقی نمیکنه ؟؟؟؟؟ مگر نه اینکه کد اسکی a=97 و کد اسکی A=65 هست ؟
پس چرا برای هر دو اینها یک کد برمیگردونه ؟؟؟؟ برای سایر کلید ها کد درسته و فقط برای حروف الفبایی چنین اتفاقی می افته
سیستم کد اسکی و همچنین مجازی کلیدها رو داخل یک عدد قرار میده به همین منظور وقتی شما این عدد رو چک میکنید عدد مشابه به دست میاد.
برای این منظور شما باید داخل پروسه hook که برای کیبورد مشخص کردید با استفاده از GetKeyboardState وضعیت صفحه کلید رو بگیرید بعد با استفاده از ToAscii این پارامترها رو تجزیه کنید تا کد کلید اصلی برگردانده بشه.
var
lpKeyStat : array [1..256] of byte;
arychar: array [1..2] of char;
GetKeyboardState(lpKeyStat);
ToAscii(wparam, lparam, lpKeyStat, AryChar, 0);
arychar خروجی هست که کد کلیدها رو در بر دارد.
fire.angle
دوشنبه 18 بهمن 1389, 12:20 عصر
درست شد
ممنون
اما برای مشکل دوم چی کار کنم
یعنی چرا وقتی هوک رو فعال بعد اگر اون رو غیر فعال کنم دیگه هوک فعال نخواهد شد مگر اینکه برنامه رو یه بار باز و بسته کنم
لطفا راهنمایی کنید
راستی اگه بخوام به جای خود کاراکتر وارد شده کد اسکی اون رو داشته باشم باید چی کار کنم در مثال بالا در متغیر AryChar کاراکتر معادل کد در اون کد اسکی قرار میگیره و یه چیز دیگه در مثال بالا باید نوع متغیر
lpKeyStat از نوع TKeyboardState باشه و نوع متغیر arychar از نوع PAnsiChar
لطفا راهنمایی کنید
tdkhakpur
دوشنبه 18 بهمن 1389, 19:44 عصر
چرا وقتی هوک رو فعال بعد اگر اون رو غیر فعال کنم دیگه هوک فعال نخواهد شد مگر اینکه برنامه رو یه بار باز و بسته کنم
برای اینکه زنجیره هوک برای این برنامه بسته شده و دیگه تو زنجیره نیست به همین دلیل باید برنامه اجرا بشه و دوباره تو زنجیره جا بگیره.
راستی اگه بخوام به جای خود کاراکتر وارد شده کد اسکی اون رو داشته باشم باید چی کار کنم
از ord استفاده کنید تا کد کاراکتر رو بدست بیارید.
یه چیز دیگه در مثال بالا باید نوع متغیر lpKeyStat از نوع TKeyboardState باشه و نوع متغیر arychar از نوع PAnsiChar
درسته برای دلفی باید این شکلی تعریف بشه.
nsco_nsco
دوشنبه 18 بهمن 1389, 21:51 عصر
سلام اگر مشکلت رو می خای ساده حل کنی دستور خوروج بده و دوبار نرم افزار رو به وسیله برنامه فراخوانی کن این هم میشه موفق باشی :قلب:
fire.angle
دوشنبه 18 بهمن 1389, 22:28 عصر
آهههههههههههههههههههههههه هههههه
یه مشکل دیگه
ببینید تابع هوک من به این صورته :
Function MyKbdHook(code:integer; wparam:word; lparam:LongWord):LongWord; stdcall;
var
lpKeyStat : TKeyboardState;
ch1: PAnsiChar;
begin
{if a key was pressed/released} //And //if key is Keyup
if (code = HC_ACTION) And (((lparam shr 31) and 1)=1) then
begin
assignfile(CurFile,'log.txt');
GetKeyboardState(lpKeyStat);
ToAscii(wparam, lparam, lpKeyStat,Ch1, 0);
if fileexists('log.txt')=false then rewrite(CurFile) else Append(CurFile);
write(CurFile,ch1);
closefile(CurFile);
end;
MyKbdHook:=CallNextHookEx(CurrentHook,code,wparam, lparam);
end;
حالا مشکل اینه که در دفعات مختلف اجرا به ازای وارد کردن یک کاراکتر ثابت مثلا حرف a یک بار ch1=a می شود و بار دیگر برابر ch1=aû و به همین ترتیب
این دیگه چه مشکلیه
یعنی چی آخه ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟
لطفا راهنمایی کنید
nsco_nsco
چهارشنبه 20 بهمن 1389, 06:21 صبح
سلام دوست من من درست یادم نیست اما قبلا در جای دیگه ای هم با این مشکل رو به رو شده بودم و مشکل این بود که پس از جاگزینی اولیه یک بار باید رفینش و یا پا ک بشه حافظه و بعد عدد بعدی رو بگیره موفق باشی :قلب:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.