PDA

View Full Version : HotKey های رشته ای - اشکال در گرفتن مسیج های یک ممو! و باز سازی آن



یوسف زالی
چهارشنبه 29 آذر 1391, 03:32 صبح
سلام.
من وقتی در یک ممو مثلا کلید a رو می زنم به ترتیب این اتفاقات می افته:

WM_KEYDOWN, wParam=65, lParam=1966081
WM_CHAR, wParam=97, lParam=1966081
WM_KEYUP, wParam=65, lParam=-1071775743

حالا می خوام دستی این کار رو کنم، دو بار a می زنه!!
متد مورد استفاده = PostMessage

توضیح = دارم برای برنامه ای هات کی های رشته ای می گذارم. برای این کار باید ابتدا تمام مسیج های فشرده شدن کلید رو هندل کنم. ضبطش کنم و بعد از بررسی شبیه سازیش کنم.
مشکل من اینه که فکر کنید در قسمت OnKeyUp یک ادیت کدی نوشتید. اون کد وقتی با متد keybd_event کار می کنید اصلا کال نمی شه.
به عبارت دیگه اون متد اصلا مسیج WM_KEYUP رو کال نمی کنه.

اصلا شاید راه بهتری برای این کار به ذهن دوستان برسه. ممنون می شم راهنمایی کنید.
دقت کنید که مثلا اگر رشته HotKey تعریف شده برای کاری ali باشه برنامه با زدن al به اندازه تعیین شده (در اینجا نیم ثانیه) منتظر می مونه تا ببینه شاید کاراکتر بعدی i باشه. در این صورت از تمام رشته صرف نظر می کنه (انگار اصلا رشته ای وارد نشده) و به جاش کاری که گفتیم انجام می ده. اگر کاراکتر آخر i نبود یا زمان از حد خاصی بیشتر شد برنامه کاراکتر های فشرده شده رو commit می کنه. کاربرد مثلا در استفاده از بارکد برای تعیین کارهای خاص ، یا حتی در وسط برنامه بنویسیم taraz بره فرم تراز رو باز کنه نه اینکه بنویسه تراز!

خلاصه مشکل:

سوال 1
--------
چه راهی برای تعریف هات کی های رشته ای سراغ دارید؟

سوال 2
--------
چرا با شبیه سازی روند مسیج ها یک کاراکتر اضافی تولید می شه؟

با تشکر.
دلفی 7 - وین 7
فکر نمی کنم مرتبط به نسخه دلفی باشه.
دوستان فوریه!

یوسف زالی
چهارشنبه 29 آذر 1391, 05:12 صبح
برای استفاده دوستان:
http://www.swissdelphicenter.ch/torry/showcode.php?id=220

سوال 1 به قوت خود باقی است.

Mask
چهارشنبه 29 آذر 1391, 12:57 عصر
روند هندل و مونیتور کردنت به چه شکله ؟
از کجا میدونی این مسیجها ارسال یا دریافت میشه؟

چه راهی برای تعریف هات کی های رشته ای سراغ دارید؟
این هات کی باید گلوبال باشه یا لوکال؟

یوسف زالی
چهارشنبه 29 آذر 1391, 21:06 عصر
متد OnMessage شی Appliction رو باز نویسی کردم.
می شه با گذاشتن شی ApplicationEvents روی فرم اصلی هم همین کار رو کرد.
هات کی ها باید گلوبال باشه. هر جای برنامه حتی اگر فوکوس رو چیزی نباشه باید Fire بشه.
با هات کی تکی مشکل ندارم من! (خیلی هم عالی، یکه یکه!!)
در حالت گلوبال هم کار می کنه.
مشکل رو هات کی های رشته ای هست.
یک نکته فهمیدم:
اگر مسیج OnKeyDown رو Handled کنید اتفاقات جالبی می افته. مثلا برا مسیج OnChar.
در کل گیج شدم. با دستورات Translate و Dispach هم ره به جایی نبردم.

Felony
پنج شنبه 30 آذر 1391, 08:25 صبح
چرا با شبیه سازی روند مسیج ها یک کاراکتر اضافی تولید می شه؟
استفاده از این کد کافی هست :


PostMessage(Memo1.Handle, WM_KEYDOWN, 65, 1966081);
PostMessage(Memo1.Handle,WM_KEYUP, 65, -1071775743);

WM_Char به صورت خودکار وقتی پیغام WM_KeyDown توسط TranslateMessage پردازش میشه به پنجره ای که فوکوس صفحه کلید رو در اختیار داره ارسال میشه ، نیازی نیست شما دوباره ارسالش کنید .

یوسف زالی
پنج شنبه 30 آذر 1391, 13:37 عصر
حاجی مشکل من اینجاست:
فرض کن به عمد مسیج WM_CHAR رو سند کردی، برنامه باید بتونه بگیرتش دیگه.
وقتی هم گرفت و لاگ کرد باید بتونه اجراش کنه.
حالا مشخص نمی شه که باید ازش صررف نظر کرد یا نه. یعنی نمشه فهمید اون مسیج دستی سند شده یا اثرات جانبی WM_KEYDOWN هست.
اگر فقط و فقط با ورودی های کیبردی (کیبرد - بارکد ریدر ..) سروکار داشتیم کاملا حق با شما بود.

Felony
پنج شنبه 30 آذر 1391, 14:48 عصر
فرض کن به عمد مسیج WM_CHAR رو سند کردی، برنامه باید بتونه بگیرتش دیگه.
وقتی هم گرفت و لاگ کرد باید بتونه اجراش کنه.
الان مشکلی این وسط نیست !

شما میتونی یک Message Handler بنویسی و این پیغام رو اگر خواستی هندل کنی و بهش عکس العمل خاصی نشون بدی ، اگر هم خواستی کاری که به صورت پیشفرض براش تعریف شده رو انجام بده باید تابع DefaultHandler رو صدا بزنی .

اینکه اون کد بالا هم حالت اکو ایجاد میکنه همونطور که گفتم طبیعی هست ، شما هم داری WM_KeyDown ( که خوش WM_Char رو میفرسته ) پاس میدی هم WM_Char رو به صورت جداگانه ، پس عملا این پیغام 2 بار ارسال میشه پس 2 بار هم عکس العمل نشون میده و کاراکتر رو چاپ میکنه .