PDA

View Full Version : handle کردن رویداد mouseMove خارج از فرم



gomnam
جمعه 16 شهریور 1386, 19:39 عصر
من میخوام یه چیزی مثل رویداد mouseMove داشته باشم به طوری که اگه موس خارج از فرم یعنی هر جای صفحه دسکتاپ بود اتفاق بیفته

در واقع من میخوام به حرکت موس در فضای صفحه عکس فضای دور موس را به قطر مثلا 100 بگیرم و در یه کنترل نشون بدم

ببخشید که 2 تا سوال را در همین تاپیک مطرح کردم
آخه چون به هم وابسته بودن گفتم شاید بهتره اینجوری بنویسم که زودتر به جواب برسم

البته دوستان اکثر لینک هایی که در مورد capture بوده را در سایت های مختلف دیدم منجمله codeproject و ....
ولی همچنان مشکل حل نشده
ممنون

gomnam
جمعه 16 شهریور 1386, 23:40 عصر
به یاری خدا این یکی هم بدون جواب درست و حسابی موند :لبخند::لبخند:

ARA
شنبه 17 شهریور 1386, 12:46 عصر
سلام
من فکر کنم باید هوک کنی api hook تا بتونی به حرکت موس تو کل صفحه ویندوز دسترسی داشته باشی

gomnam
شنبه 17 شهریور 1386, 12:57 عصر
سلام
من فکر کنم باید هوک کنی api hook تا بتونی به حرکت موس تو کل صفحه ویندوز دسترسی داشته باشی

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

BeyondMicrosoft
شنبه 17 شهریور 1386, 16:30 عصر
با سلام
اون چیزی که من به ذهنم میرسه می توانید یک تایمر یا یک Thread جداگانه ایجاد و در آن هر لحظه مقتصات موس را با کمک MousePosition به دست آورید حتی یک رویدادی خودتان می توانید ایجاد کنید که هنگامی که مقتصات موس با مقتصات آخرین باری که در تایمر یا Thread خوانده اید اگر تغییر کرده بود رخ بدهد.

gomnam
شنبه 17 شهریور 1386, 21:21 عصر
با سلام
اون چیزی که من به ذهنم میرسه می توانید یک تایمر یا یک Thread جداگانه ایجاد و در آن هر لحظه مقتصات موس را با کمک MousePosition به دست آورید حتی یک رویدادی خودتان می توانید ایجاد کنید که هنگامی که مقتصات موس با مقتصات آخرین باری که در تایمر یا Thread خوانده اید اگر تغییر کرده بود رخ بدهد.

روش خوبی نیست و مطمئن هم نیست
روش مطمئن اینه که از WM استفاده بشه اما مشکل اینجاست که نمیدونم WM مربوط به mouseMove کدومه
البته WM_MOUSEMOVE برای همین کار هست ولی مشکلش اینه که فقط رویداد mousemove زمانی که موس روی فرم است اتفاق میفته

البته شاید همین باشه و من طریقه استفاده اونو نمیدونم
من اونو (WM_MOUSEMOVE) را توی wndproc که ovveridesh کردم چک کردم
ولی زمانی که موس خارج از فرم هست ودر حال حرکت است این Message به OS مثل اینکه send نمیشه

شاید هم باید messaeg فوق را همراه با WM های دیگه ای به کار ببرم تا جواب بگیرم

لطفا اگه کسی توی اینجور زمینه ها کار کرده کمک کنه
ممنون

gomnam
شنبه 17 شهریور 1386, 21:45 عصر
سلام
من فکر کنم باید هوک کنی api hook تا بتونی به حرکت موس تو کل صفحه ویندوز دسترسی داشته باشی

میشه یه نمونه کد بذارین؟

gomnam
یک شنبه 18 شهریور 1386, 10:36 صبح
دوستان خبری نیست ؟ یکی کمک کنه plz

حامد مصافی
یک شنبه 18 شهریور 1386, 11:48 صبح
روش خوبی نیست و مطمئن هم نیست
روش مطمئن اینه که از WM استفاده بشه اما مشکل اینجاست که نمیدونم WM مربوط به mouseMove کدومه
البته WM_MOUSEMOVE برای همین کار هست ولی مشکلش اینه که فقط رویداد mousemove زمانی که موس روی فرم است اتفاق میفته

این تنها روش موجوده که می تونه مشکل شما رو حل کنه.



البته دوستان اکثر لینک هایی که در مورد capture بوده را در سایت های مختلف دیدم منجمله codeproject و ....
این روش بیشتر زمانی به درد می خوره که بخواهید یک پنجره جهنده نمایش بدید. چون بعد از کلیک Message ها به برنامه شما ارسال نمی شوند.

gomnam
یک شنبه 18 شهریور 1386, 12:12 عصر
این تنها روش موجوده که می تونه مشکل شما رو حل کنه.

بله میدونم ولی چطوری ؟ این مهمه




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


منظورتون از پنجره جهنده چیه؟میشه بیشتر توضیح بدین؟

ARA
یک شنبه 18 شهریور 1386, 12:16 عصر
http://www.codeproject.com/csharp/globalhook.asp

این رو ببین زمانی که موس حرکت میکنه مختصات اون رو نشون میده

mehdi.mousavi
یک شنبه 18 شهریور 1386, 12:21 عصر
روش خوبی نیست و مطمئن هم نیست
روش مطمئن اینه که از WM استفاده بشه اما مشکل اینجاست که نمیدونم WM مربوط به mouseMove کدومه
البته WM_MOUSEMOVE برای همین کار هست ولی مشکلش اینه که فقط رویداد mousemove زمانی که موس روی فرم است اتفاق میفته

البته شاید همین باشه و من طریقه استفاده اونو نمیدونم
من اونو (WM_MOUSEMOVE) را توی wndproc که ovveridesh کردم چک کردم
ولی زمانی که موس خارج از فرم هست ودر حال حرکت است این Message به OS مثل اینکه send نمیشه

شاید هم باید messaeg فوق را همراه با WM های دیگه ای به کار ببرم تا جواب بگیرم

لطفا اگه کسی توی اینجور زمینه ها کار کرده کمک کنه
ممنون


سلام.
جوابی که ARA دادن کاملا صحیح هستش، یعنی باید از Global Hook ها استفاده کنید. روشی که جنابعالی دارید توضیح میدین، کاملا نادرسته. WM_MOUSEMOVE هنگامی به یه پنجره ارسال میشه که Mouse روی پنجره به حرکت در بیاد. هنگامی که شما Window Proc رو override میکنید و پیام مزبور رو میگیرید، در واقع قبل از فراخوان شدن OnMouseMove روی فرم مورد نظر دارید پیام رو پردازش میکنید، پس تفاوتی نمیکنه که کد رو در OnMoseMove بنویسید یا WndProc رو override کنید و اونجا به WM_MOUSEMOVE پاسخ بدین.

ضمنا، برای اینکه با نحوه کارکردن Hook ها آشنا بشید، به این مقاله (http://www.codeproject.com/csharp/globalsystemhook.asp)رجوع کنید.