View Full Version : سوال: نوشتن کد اسکی در بافر کیبورد
quiet_programmer
دوشنبه 27 دی 1389, 17:29 عصر
با سلام خدمت دوستان و بزرگواران.
همونطور که میدونین برای ارسال کلید میشه از تابع Sendkey تو VB استفاده کرد. ولی این تابع وقتی که میخوام به محیط دیباگ یه کلیدی رو ارسال کنم، کلید ارسال میشه (یعنی هر برنامه ای میتونه اون کاراکتر رو دریافت کنه) ولی محیط Debug نمیتونه اونرو دریافت کنه(انگار که اصلا کلیدی فشرده نشده). به همین خاطر از تابع api برای این کار استفاده کردم. ولی این تابع به جای ارسال کلید مربوطه فقط حرف a رو ارسال میکنه(فقط به محیط debug. بقیه Applicationها بدن هیچ مشکلی اون کلید رو دریافت میکنن). یعنی با ارسال b یا هر کاراکتر دیگه محیط دیباگ فقط a دریافت میکنه. کدی که من استفاده کردم این شکلیه.
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Public Sub KeyDown(ByVal vKey As Byte)
keybd_event vKey, 0, KEYEVENTF_EXTENDEDKEY, 0
End Sub
اگه میشه لطفا راهنمایی کنین که چه طور میشه به محیط debug کاراکتر ارسال کرد.
vbhamed
سه شنبه 28 دی 1389, 11:13 صبح
سلام
من اين دستور رو تست كردم مشكلي نداشت
keybd_event 66, 0, 0, 0
و حرف b ارسال شد، اما يه مطلب هست اونم اينكه وقتي كليدي فشرده ميشه بايد رها هم بشه، شما وقتي دستتون رو رو صفحه كليد ميزاريد تا ابد كليدي رو فشار نمي دين و رهاش هم مي كنيد، اونم دستورش اينه
keybd_event 66, 0, KEYEVENTF_KEYUP, 0
quiet_programmer
سه شنبه 28 دی 1389, 12:02 عصر
خیلی ممنون از راهنماییتون.
ولی میدونین مشکل من چیه؟ با این کد حرف b ارسال میشه ولی دیباگ نمیتونه اونرو دریافت کنه و فقط a رو دریافت میکنه.
برای مثال برین cmd و بعد بنویسین debug حالا برنامه خودتون رو اجرا کنین و بگین که حرف b رو محیط debug ارسال کنه. مبینین که فقط a ارسال میشه. انگار کاربر فقط دکمه a رو فشار داده
اگه راهنماییم کنین ممنونتون میشم.
vbhamed
سه شنبه 28 دی 1389, 17:16 عصر
سلام
اينم پاسخ سؤال شما :
بعد از اجرا، برنامه 2 ثانيه صبر مي كنه تا پنجره ديباگ رو فعال كنيد بعد عبارت ارسال ميشه
quiet_programmer
سه شنبه 28 دی 1389, 19:35 عصر
با سلام.
خیلی ممنون از کدی که در اختیارم قرار دادین. واقعا لطف کردین.
ولی یه مشکل دیگه.
من رشته ارسالی رو از یه فایل میخونم و تو متغییر St که از نوع String هست قرار میدم و ارسال میکنم که به صورت زیر محیط debug اونرو دریافت میکنه.
65229
جالبه که بگم وقتی متغییر st رو به صورت "St="mov مقدار دهی میکنم وبعد ارسال میکنم به صورت صحیح ارسال میشه.
در ضمن باید بگم که مطمئنم که فایل رو به درستی میخونه. یعنی برای شکل بالا مطمئن بودم که رشته ای که از فایل خوند برابر mov ax,bx بود
دستور خوندن از فایل رو هم به صورت Line Input #1,St نوشتم.
این رو هم بگم که اعداد وبراکت و کاما پرانتز و ... به درستی ارسال میشن
اگه لطف کنین دوباره کمکم کنین ممنونتون میشم. خیلی ضروریه
vbhamed
چهارشنبه 29 دی 1389, 11:26 صبح
سلام
شما كه نوشته بودين با زياد نمودن تاخير مشكل حل شده
در نهايت اون تيكه برنامتون رو كه قابل اجرا باشه بزاريد تا بررسي بشه
quiet_programmer
چهارشنبه 29 دی 1389, 11:59 صبح
سلام آره حل شد ولی اونجا من st رو به صورت مستقیم مقدار دهی کرده بودم.
پیشا پیش از لطفی که خواهین کرد ممنونم
quiet_programmer
پنج شنبه 30 دی 1389, 14:37 عصر
با سلام.
من همچنان منتظر جوابتون هستم اگه راهی نداره بگین تا کلک بزنم بهش.
میخوام حرف به حرف فایل رو بخونه و خودش یه رشته تولید کنه. خوب همونطور که میدونین این کار یه کار اضافیه مگه اینکه شما لطف کنین یه راه حل جدید پیشنهاد کنین.
ghasemweb
پنج شنبه 30 دی 1389, 23:44 عصر
سلام با چه روشي ميشه يك كليد رو به يك برنامه خاصي ارسال كرد ؟
quiet_programmer
جمعه 01 بهمن 1389, 12:08 عصر
سلام با چه روشي ميشه يك كليد رو به يك برنامه خاصي ارسال كرد ؟
سلام برنامه ای که اون بالا هست رو دانلود کن (زحمت نوشتن این برنامه رو جناب vbhamed (http://barnamenevis.org/member.php?10624-vbhamed) کشیدن) بعد برنامه رو به حالت اجرا ببر وبرنامه ای که قصد داری این کلید به اون برناممه ارسال بشه رو باز کن.
البته میتونی اینکار رو هم انجام بدی که برنامه ی در حال اجرا تو حالت معمولی هیچ کلیدی رو ارسال نکنه و برسی کنه که هر وقت برنامه ی مورد نظرتون (همونی که قراره کلید رو به اون ارسال کنی) باز شد کلید رو ارسال کنه.
راستی ضمن تشکر از vbhamed (http://barnamenevis.org/member.php?10624-vbhamed) مشکل منم حل شد. اینطوری که برای ارسال کلید به محیط دیباگ فقط حروف کوچیک ارسال میشه. پس قبل از ارسال توسط تابع LCase رشته رو به حرف کوچیک تبدیل کنید.
ghasemweb
جمعه 01 بهمن 1389, 12:57 عصر
خب اون برنامه تست كردم جواب نداد مثلا winamp در حال اجراست و اگر فوكوس رو خود وينمپ باشه كليد B عمل نكست رو انجام ميده و برنامه بالا با اينكه كد B در خروجي بافر كيبرد قرار ميده ولي عمل نميكنه !
quiet_programmer
جمعه 01 بهمن 1389, 16:59 عصر
یادت باشه حتما موقع ارسال کلید فوکوس بایستی روی winamp باشه.
ghasemweb
جمعه 01 بهمن 1389, 17:18 عصر
آره حق با شماست حالا اگه بخواييم با همين برنامه دكمه هاي مالتي مديا رو تو خروجي بافر قرار بديم بايد چه كدي رو بفرستيم ؟ منظورم دكمه هاي play-pause-stop و ... هستش
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.