PDA

View Full Version : حرفه ای: ارسال کلید ها به هندل مشخص با Sendmessage



mehran901
جمعه 18 مرداد 1392, 21:49 عصر
سلام بر دوستان ،

مشکلی داشتم گفتم مطرح کنم دوستان نظر بدن ببینیم چطور میشه حلش کرد

میخوام بطور مثال توسط برنامه ای که با ویبی مینویسم برنامه دیگری رو کنترل کنم ، به همین منظور میخوام کلید به طور مثال G رو که در واقع جزو کلید های میانبر داخلی برنامه هست رو توسط برنامه خودم فشار بدم ولی : نمیخوام از سند کی و این روش های آماتور واسه این کار استفاده کنم بلکه میخوام توسط ی روشی مثل sendmessage درواقع مد کلید G یا مثلا راست کیک موس رو به هندل اون برنامه بفرستم که درصورتی که فرد روی برنامه فوکوس نداشت هم بشه مدیریتش کرد

به این منظور &H2 رو به هندل بخش مورد نظر از برنامه ارسال میکنم ولی در واقع راست کلیک اتفاق نمیوفته و درصورتی که از توابعی مثل keybd_event هم استفاده بشه ، مثل سند کی عمل میکنه و نمیشه به هندل خاصی اون رو فرستاد

پیشنهاد دوستان چیه که بشه بدون سند کی کلیدی رو تو برنامه ای شبیه سازی کرد ؟ ( فقط تو همون برنامه و بدون فوکوس روش )


و یک سوال دیگه ، ثوابتی که با عبارت VK شروع میشن رو نمیشه با Sendmessage ارسال کرد ؟ مثل : VK_F1

miladatashin
شنبه 19 مرداد 1392, 01:58 صبح
نمیخوام از سند کی و این روش های آماتور واسه این کرا استفاده کنم
سلام. احتمالا از SendInput میتونید استفاده کنید. البته اگه از نظرتون از روش های آماتورمحسوب نمیشه

mehran901
شنبه 19 مرداد 1392, 04:06 صبح
ممنون :لبخندساده: در اولین فرصت بررسیش میکنم ، دوستان دیگه هم اگه نظری دارن دریغ نکنند

Mr'Jamshidy
شنبه 19 مرداد 1392, 12:25 عصر
و یک سوال دیگه ، ثوابتی که با عبارت VK شروع میشن رو نمیشه با Sendmessage ارسال کرد ؟ مثل : VK_F1

تا جایی که من میدونم عباراتی که با VK شروع میشن با ثابت های داخل برنامه برابر هستن مثلا
KeyCodeConstants.vbKeyF1

KeyCodeConstants مرجع کد کلید هاست کد کلید هم در کل سیستم عامل یک سان هست (البته تا جایی که من میدونم)

mehran901
شنبه 19 مرداد 1392, 14:18 عصر
ممنون آقای جمشیدی ، یک مسئله ای ... خب مثلا برنامه ای که میخوایم کنترلش کنیم از ی کلید میانبر استفاده میکنه چرا نمیشه با Sendmessage کد اون کلید میانبر رو به بخشی مورد نظر برنامه فرستاد (مثلا ی listview هست از کلید میانبر خاصی پشتیبانی میکنه ) تا در واقع بدون اینکه فوکوس روی برنامه باشه کلید میانبر برنامه فعال بشه ؟

Mr'Jamshidy
شنبه 19 مرداد 1392, 18:52 عصر
ممنون آقای جمشیدی ، یک مسئله ای ... خب مثلا برنامه ای که میخوایم کنترلش کنیم از ی کلید میانبر استفاده میکنه چرا نمیشه با Sendmessage کد اون کلید میانبر رو به بخشی مورد نظر برنامه فرستاد (مثلا ی listview هست از کلید میانبر خاصی پشتیبانی میکنه ) تا در واقع بدون اینکه فوکوس روی برنامه باشه کلید میانبر برنامه فعال بشه ؟

برادر من جوینده یابنده است
اول هندل کنترل رو پیدا کن بعد هم ازش استفاده کن

کد رو طوری نوشتم که ساده بشه فهمید

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SleepEx Lib "kernel32" (ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Enum sMethod
KeyDown = &H100
KeyUp = &H101
KeyPress = &H102
End Enum

Enum kShift
Sh_Shift = 4
Sh_Ctrl = 2
Sh_Alt = 1
End Enum

Private Const VK_SHIFT = &H10
Private Const VK_CONTROL = &H11
Private Const VK_ALT = &H12


Function SendKeysTo(ByVal Target As Long, ByVal KeyCode As KeyCodeConstants, ByVal KeyShift As kShift, ByVal SendMethode As sMethod) As Boolean
Dim sMode As Integer, KeySh As Integer, KeyCo As Integer
Dim Ret As Integer

sMode = SendMethode
KeySh = KeyShift
KeyCo = KeyCode

If Not KeySh = 0 Then
If (KeySh And 1) = 1 Then Call keybd_event(VK_ALT, 0, 0, 0)
If (KeySh And 2) = 2 Then Call keybd_event(VK_CONTROL, 0, 0, 0)
If (KeySh And 4) = 4 Then Call keybd_event(VK_SHIFT, 0, 0, 0)
End If

SleepEx 100, False
DoEvents

Ret = PostMessage(Target, SendMethode, KeyCode, 0&)

If Not KeySh = 0 Then
If (KeySh And 1) = 1 Then Call keybd_event(VK_ALT, 0, 2, 0)
If (KeySh And 2) = 2 Then Call keybd_event(VK_CONTROL, 0, 2, 0)
If (KeySh And 4) = 4 Then Call keybd_event(VK_SHIFT, 0, 2, 0)
End If

SendKeysTo = Ret
End Function

mehran901
دوشنبه 21 مرداد 1392, 01:42 صبح
آقای جمشیدی خیلی ممنون ، یک مسئله ای ... با این روش postmessage میشه انواع کلید ها ی کیبوردرو ارسال کرد ولی کلید های موس رو نه :D .
از لحاظ سرچ کردنم چیزی کم نذاشتم .:لبخند:.. شما راه حلی واسه اون سراغ ندارین ؟ :لبخندساده:

Mr'Jamshidy
سه شنبه 22 مرداد 1392, 01:39 صبح
آقای جمشیدی خیلی ممنون ، یک مسئله ای ... با این روش postmessage میشه انواع کلید ها ی کیبوردرو ارسال کرد ولی کلید های موس رو نه :D .
از لحاظ سرچ کردنم چیزی کم نذاشتم .:لبخند:.. شما راه حلی واسه اون سراغ ندارین ؟ :لبخندساده:

بعید میدونم

Private Const WM_MOUSEACTIVATE = &H21
Private Const WM_MOUSEMOVE = &H200
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208

mehran901
سه شنبه 22 مرداد 1392, 02:25 صبح
من دقیقا همین رو سند کرده بودم ولی کلید موس ارسال نمیشه مشکل اینه :|

هرچی مقدار مرتبط تو بخش Constant برنامه Api viewer بودو تست کردم باز نمیشه :|

مرسی که جواب دادین

Mr'Jamshidy
سه شنبه 22 مرداد 1392, 10:10 صبح
ببین دوست من
یک برنامه هست که همراه با ویژوال بیسیک نصب میشه به نام Spy++ با اون Message های یم پنجره رو هوک کن ببین چه پیغام های موقع کلید به برنامه ارسال میشه
حالا من ببینم میتونم یک سورس برات جمع و جور کنم

mehran901
سه شنبه 22 مرداد 1392, 21:45 عصر
خیلی ممنون خیلی لطف کردین ... با api monitor قبلا هوک کردم روش ، و مشغول انجام این کار بودم هنوز به نتیجه نرسیده ... اگه شما هم تونستین ی چیزی سرهم کنین به جواب برسه ممنون میشــــــــــــــــــــــ م :x

همین که وقت گذاشتین جواب دادین خیلی ارزش داشت