PDA

View Full Version : برنامه ای برای دابل کلیک کردن، بدون استفاده از ماوس؟



mah.yar
پنج شنبه 08 فروردین 1387, 17:22 عصر
همونطور که میدونید با توابع API میتونیم مکان نما ماوس رو جابجا کنیم و ...
حالا سوالم اینه چه جوری میتونیم با یه برنامه کلیک و دابل کلیک رو اجرا کنیم یعنی بدون ماوس؟
آیا اصلا شدنی هست؟
با تشکر

vbhamed
پنج شنبه 08 فروردین 1387, 18:17 عصر
سلام
فکر می کنم با تابع SendMessage میشه این کار رو انجام داد
البته این تابع یکی از کلی ترین توابع Api هست که با توجه به پارامترهاش، کارهای خیلی زیادی انجام میده
تو MSDN یا راهنمای Api دنبالش باشید

__siavash__
پنج شنبه 08 فروردین 1387, 18:44 عصر
همونطور که میدونید با توابع API میتونیم مکان نما ماوس رو جابجا کنیم و ...



حالا سوالم اینه چه جوری میونیم با یه برنامه دابل کلیک رو اجرا کنیم یعنی بدون ماوس؟
آیا اصلا شدنی هست؟
با تشکر

این کار شدنیه
شما اول باید هندل اون آبجکتی رو که میخوای پیغام کلیک رو براش بفرستی پیدا کنی !

Mr'Jamshidy
جمعه 09 فروردین 1387, 12:01 عصر
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const MOUSEEVENTF_MIDDLEUP = &H40
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP = &H10
Private Sub Form_Activate()

Do
'Simulate a mouseclick on the cursor's position
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI
DoEvents
Loop
End Sub

mah.yar
جمعه 09 فروردین 1387, 21:21 عصر
ضمن تشکر از دوستان

ببینید صورت مسئله رو اینجوری تغییر میدم:
یه راه حلی که مثلا اگر کلید A از صفحه کلید فشار داده شد ماوس تو همون محلی که هست چپ کلیک بشه یا همون در واقع کلید A کار چپ کلیک رو انجام بده و کلید S کار راست کلیک رو انجام بده.
نکته:برنامه برای تمامی محیط ویندوز کار کنه نه فقط برای فرم برنامه.

اما سوالم اینه که آیا میشه مختصات مکان نما ماوس رو به همراه پیام WM_LBUTTONUP با تابع SendMessage بفرستم و...
راه حل بهتری سراغ دارید ممنون میشم.

PrivateDeclareFunction SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As IntPtr, ByVal wMsg AsInteger, ByVal wParam AsInteger, ByVal lParam AsInteger) AsInteger

Mbt925
جمعه 09 فروردین 1387, 21:47 عصر
تابعی که دوستمون معرفی کردن جوابگوی مشکل شما هست.
مختصات هم به عنوان ورودی دریافت میکنه.

طرز استفاده از تابع SendMessage:





Const BM_CLICK = &HF5
SendMessage Window_Handle, BM_CLICK, 0, 0&

mah.yar
جمعه 09 فروردین 1387, 22:18 عصر
بله درسته تابع mouse_event همون کاری رو که میخوام انجام میده.(تشکر دوباره)

اما یه سوال مبتدیانه:
حالا میخوام کلید های صفحه کلید رو چک کنم که چه کلیدهایی فشار داده شده، وقتی تو رویداد keypress فرم این کار رو انجام میدم مشکلی ندارم اما وقتی فرم minimize میشه جواب نمیده.
چه راه حلی پیشنهاد میکنید تا اینکه برنامه در هر حالتی که باشه تشخیص بده که چه کلیدی فشار داده شده.
آیا Tray icon جواب میده؟

مهران رسا
جمعه 09 فروردین 1387, 22:31 عصر
بله درسته تابع mouse_event همون کاری رو که میخوام انجام میده.(تشکر دوباره)

اما یه سوال مبتدیانه:
حالا میخوام کلید های صفحه کلید رو چک کنم که چه کلیدهایی فشار داده شده، وقتی تو رویداد keypress فرم این کار رو انجام میدم مشکلی ندارم اما وقتی فرم minimize میشه جواب نمیده.
چه راه حلی پیشنهاد میکنید تا اینکه برنامه در هر حالتی که باشه تشخیص بده که چه کلیدی فشار داده شده.
آیا Tray icon جواب میده؟

برای دریافت کد اسکی کلیدهایی که در خارج محیط برنامه (و یا بهتره بگیم در کل محیط ویندوز) زده میشن باید از تابع GetAsyncKeyState استفاده کنی :



Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer



Private Sub Timer1_Timer()
For i = 1 To 34568
results = 0
results = GetAsyncKeyState(i)
If results <> 0 Then
Text1.Text = Chr(i)
End If

Next i
If Text1.Text = "E" Then End
End Sub

Mr'Jamshidy
شنبه 10 فروردین 1387, 00:00 صبح
آقا یک سوال

در مورد GetAsyncKeyState چی کار کنیم که با استفاده از Ctrl, Alt, Shift بشه ازش استفاده کرد

در ضمن بجای کلید های F1,..., F12 حروف کوچیک میزنه

mah.yar
شنبه 10 فروردین 1387, 09:53 صبح
در مورد GetAsyncKeyState چی کار کنیم که با استفاده از Ctrl, Alt, Shift بشه ازش استفاده کرد
در ضمن بجای کلید های F1,..., F12 حروف کوچیک میزنه

منم همین سوال رو دارم!

در ضمن من به برنامه گفتم که اگه کاربر کلید A رو فشار داد تو چپ کلیک رو انجام بده و تا اینجا مشکلی نیست ولی مشکل اینجاست که اگه برنامه من در حال اجرا باشه و کاربر تو محیط word در حال تایپ کردن باشه و کلید A رو فشار بده برنامه اول در جایی که مکان نما ماوس هست کلیک میکنه و سپس حرف A رو تایپ میکن و من نمیخوام اصلا حرف A تایپ بشه و فقط چپ کلیک کنه...؟
امیدوارم منظورم رو رسونده باشم
با تشکر

مهران رسا
شنبه 10 فروردین 1387, 10:33 صبح
آقا یک سوال

در مورد GetAsyncKeyState چی کار کنیم که با استفاده از Ctrl, Alt, Shift بشه ازش استفاده کرد

در ضمن بجای کلید های F1,..., F12 حروف کوچیک میزنه


کلید های روی کیبورد رو از این دم بزن ببین چه کاراکتری توی Textbox نشون داده میشه

مهران رسا
شنبه 10 فروردین 1387, 10:37 صبح
منم همین سوال رو دارم!

در ضمن من به برنامه گفتم که اگه کاربر کلید A رو فشار داد تو چپ کلیک رو انجام بده و تا اینجا مشکلی نیست ولی مشکل اینجاست که اگه برنامه من در حال اجرا باشه و کاربر تو محیط word در حال تایپ کردن باشه و کلید A رو فشار بده برنامه اول در جایی که مکان نما ماوس هست کلیک میکنه و سپس حرف A رو تایپ میکن و من نمیخوام اصلا حرف A تایپ بشه و فقط چپ کلیک کنه...؟
امیدوارم منظورم رو رسونده باشم
با تشکر

واسه این مشکل (Word) یه پیشنهاد دارم ولی فکر نمی کنم فایده داشته باشه چون در این صورتی از تایپ شدن کلمه A توی محیط MS-WOrd کاملاً جلوگیری میشه .

حالا بریم سراغ راه حل : می تونی در زمانی که کلید A زده شد با استفاده از کد زیر یه BackSpace بفرستی ...



Sendkeys "{backspace}"

mah.yar
شنبه 10 فروردین 1387, 11:28 صبح
ببینید من از دو تابع Api زیر که تو همین تاپیک توسط دوستان معرفی شدند استفاده کردم یعنی: GetAsyncKeyState و mouse_event و کدی که استفاده کردم اینه:

If GetAsyncKeyState(i) <> 0 Then
If Chr(i) = "A" Then
'simulate mouse click
mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, cButt, dwEI
mouse_event MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI
End If
End If

حالا فرض کنید برنامه در قسمت sys tray در حال اجرا باشه و کاربر کلید A رو فشار بده--> طبق معمول ویندوز تو محیط دسکتاب یا هر پنجره دیگه ای که باز و فعال باشه به دنبال فولدری میگرده که اولین کاراکترش حرف A باشه و از طرفی همونطور که در کد بالا میبینید من عمل چپ کلیک رو برای برنامه تعریف کردم در نتیجه:
ویندوز ابتدا فولدری رو که اولین کاراکترش A باشه رو Select میکنه و بلافاصله سریع در محل مکان نما ماوس کلیک میکنه... یه راه حلی پیشنهاد بدین که مودبانه ویندوز رو دور بزنه.

یه مثال خوب پیدا کردم:مثل نرم افزار Key Mouse Genie که با دکمه های right arrow وleft arrow و... میتونید ماوس رو چپ و راست کنیم و با تعریف یه کلید دلخواه میتونیم عملیات راست کلیک و چپ کلیک رو انجام بدیم

با تشکر

مهران رسا
شنبه 10 فروردین 1387, 11:41 صبح
شما جواب سوالات قبلی رو میگیرد که سوال جدید مطرح می کنید ؟

Mr'Jamshidy
شنبه 10 فروردین 1387, 14:02 عصر
منم مشکل شما رو دارم میخوام جلوی بعضی از کلید ها به بعضی قسمت های برنامم گرفته بشه

یکی از دوستان خوبم قراره یک برنامه بهم بده بهش میگم تو این تاپیک بزارش تا شما هم استفاده کنی

mah.yar
شنبه 10 فروردین 1387, 14:29 عصر
شما جواب سوالات قبلی رو میگیرد که سوال جدید مطرح می کنید ؟
بله من تا اینجا با راهنمایی های خوبی که دوستان در این تاپیک مطرح کردند برنامم رو پیش بردم.

کد زیر رو هم امتحان کردم:

Sendkeys "{backspace}"

کد جالبی بود ولی متاسفانه تو این قسمت مشکل رو حل نکرد:

جالبه بدونید وقتی این کد رو به برنامه اضافه و برنامه رو اجرا کردم،zone alarm دقیقا همون پیامی میداد که برنامه Key Mouse Genie رو اجرا میکردم.

mah.yar
شنبه 10 فروردین 1387, 22:04 عصر
راه حلشو پیدا کردم:

صورت مسئله:
وقتی تو محیط ویندوز یه کلید مثلا A فشار داده شد به جای اینکه دستورات ویندوز اجرا بشه(از قبیل تایپ حرف A و ...) دستورات مورد نظر ما اجرا بشه و عملا کلید A خنثی بشه ..

راه حل:
استفاده از تابع RegisterHotKey:
این تابع یک کلید یا کلیدی ترکیبی را در محیط ویندوز ثبت میکند.
کلیدی که به وسیله این تابع تعریف می شود درون قسمتی از حافظه قرار میگیرد و در هر جای ویندوز که کلید تعریف شده فشرده بشه، برنامه ما در صورت فعال بودن عکسل العمل نشون میده(گرفته شده از کتاب برنامه نویسی سیستمی در ویندوز با توابع API تالیف پژمان حسینی)

پس هر عکس العملی که ما در قبال فشرده شدن کلید مورد نظر در برنامه تعریف کنیم اجرا میشه که این عکس العمل میتونه همونکلیک کردن با توابع API باشه یا حتی میتونه کد زیر باشه :

SendKeys ("A")(یعنی در واقع غیر مستقیم کاراکتر مورد نظر چاپ میشه)

پس اگه هیچ عکس العملی تعریف نکنیم کلید مورد نظر عملا غیرفعال میشه.
تو برنامه API-Guied این تابع رو به همراه یه Example خوب توضیح داده که میتونید برای درک بیشتر به اونجا مراجعه کنید.
اگه لازم میدونید اعلام کنید تا اون مثال رو تو تاپیک بزارم.

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