PDA

View Full Version : حبس کردن ماوس



saber187518
دوشنبه 03 خرداد 1389, 19:36 عصر
سلام دوستان عزیز
من میخوام یک برنامه رو بنویسم که ماوس داخل یک دایره محبوس بشه.
چه کار باید بکنم.
خیلی خیلی ممنون

iman_me
سه شنبه 04 خرداد 1389, 00:44 صبح
می خوای دایره باهاش حرکت کنه یا فقط موس نتونه از توش بیرون بیاد و دایره ثابت باشه

saber187518
سه شنبه 04 خرداد 1389, 01:20 صبح
سلام دوست عزیز
من میخوام یک دایره داشته باشم که روی فرمم طراحی شده و یک دایره بزرگتر هم دارم که دایره قبل رو در برگرفته و مثلا قطرش 2 سانت بزرگتره.
حالا میخوام کاری کنم که ماوس از بین دو دایره رد نشه.
یعنی وارد دایره کوچک نشه و از دایره بزرگ هم خارج نشه.
خواهش میکنم کمکم کنین.

Hossein Bazyan
سه شنبه 04 خرداد 1389, 10:42 صبح
سلام دوست عزیز
من میخوام یک دایره داشته باشم که روی فرمم طراحی شده و یک دایره بزرگتر هم دارم که دایره قبل رو در برگرفته و مثلا قطرش 2 سانت بزرگتره.
حالا میخوام کاری کنم که ماوس از بین دو دایره رد نشه.
یعنی وارد دایره کوچک نشه و از دایره بزرگ هم خارج نشه.
خواهش میکنم کمکم کنین.

سلام
در وی بی 6 با توابع API میتونم بنویسیم ولی در دات نت هنوز روش کار نکردم
اگر برای وی بی 6 لازم داشتی یا در دات نت خواستی از API استفاده کنید بگو تا کدش رو بذارم

maminb
سه شنبه 04 خرداد 1389, 11:26 صبح
اگه ممکنه برای vb.net کدشو بذارید.

Hossein Bazyan
سه شنبه 04 خرداد 1389, 12:56 عصر
اگه ممکنه برای vb.net کدشو بذارید.




سلام
دوست عزیز من گفتم برای دات نت روش کار نکردم
اما برای وی بی 6 میذارم فکر میکنم بشه همان کدها را در دات نت هم بکار برد یا خودتون با استفاده از ابزار تبدیل 6 به دات نت خود دات نت اینکار رو انجام بدید
شرح کدها
یک کلاس یا مدول بساز و کدهای Api زیر را در آن کپی کن


Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public CopyRect As RECT ' For Increase MOUSE
Public Declare Function ClipCursorRect Lib "user32" Alias "ClipCursor" (lpRect As RECT) As Boolean
Public Declare Function ClipCursorClear Lib "user32" Alias "ClipCursor" (ByVal lpRect&) As Boolean
Public Declare Function SetCursorPos Lib "user32" (ByVal X%, ByVal Y%) As Boolean
Public Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long

RECT برای مختصات شی که میخوای ماوس رو درش محدود کنی بکار میره
سپس تابع زیر را هر جا خواستی میتونی بذاری ( اگه زیاد استفاده میکنی در همان مدول یا کلاس پیش Api ها قرارش بده
برای فراخوانی محدود کردن باید به شکل زیر تابع رو صدا بزنی


Call MouseMahdod(Text1.hWnd, True)

که من اینجا ماوس را در Text1 محدود کردم و True هم یعنی محدود کن
برای باز کزدن ماوس هم به جای True باید False بنویسی به شکل زیر



Call MouseMahdod(Text1.hWnd, False)

در ضمن من کدها رو به شکل برنامه نوشتم که میتونید دانلود کنید.
یادتون نره ماوس که محدود شد به هیچ وجه از اون محیط بیرون نمیاد ( البته میشه Alt~Tab ) رو زد و به برنامه دیگه ای رفت و یا راههای دگیر ) اما منظور من در همان برنامه ماوس به هیچ وجه آزاد نمیشه مگر اینکه همان تابع با False فراخوانی بشه . بهمین دلیل باید برای خروج ماوس از محدوه تهمیداتی را باید بیندیشید مثلا کلید Esc یا هر کلیدی در صفحه کلید که در مثال من Command2 رو داخل text1 گذاشتم که بتوانی ماوس رو خارج کنید.

Open-Source
سه شنبه 04 خرداد 1389, 13:53 عصر
با این کد میشه ماوس رو توی فرم حبس کرد:
Cursor.Clip = new Rectangle(this.Location, this.Size)

با یه کم دستکاری میتونی تبدیل به دایره کنی.

Hossein Bazyan
سه شنبه 04 خرداد 1389, 14:14 عصر
سلام
جالبه
اینجاست که فرق بین وی بی 6 و دات نت مشخص میشه
من سال 2003 این کد رو برای وی بی 6 نوشتم . یادمه وقتم رو خیلی گرفت. اما در دات نت همین کار رو با یک خط کد میشه انجام داد

mhmoein
سه شنبه 04 خرداد 1389, 14:40 عصر
سلام این همون فایل MOUSE.RAR دوستمون Hossein Bazyan (http://www.barnamenevis.org/forum/member.php?u=4029) هست که از وی بی 6 به دات نت تبدیل کردم. باتشکر از ایشان

saber187518
سه شنبه 04 خرداد 1389, 22:43 عصر
با سلام خدمت تمامی اساتید بزرگوار
از تمامی دوستان به خاطر توجهی که به این تاپیک کردن واقعا ممنونم ولی من میتونم داخل یک محیط چهار گوش مثل مربع یا مستطیل حبس کنم. مشکل من حبس ماوس داخل یک دایره هست به همون ترتیبی که عرض کردم خدمت دوستان.
واقعا ممنون میشم که به من لطف کنین.

Hossein Bazyan
سه شنبه 04 خرداد 1389, 22:51 عصر
با سلام خدمت تمامی اساتید بزرگوار
از تمامی دوستان به خاطر توجهی که به این تاپیک کردن واقعا ممنونم ولی من میتونم داخل یک محیط چهار گوش مثل مربع یا مستطیل حبس کنم. مشکل من حبس ماوس داخل یک دایره هست به همون ترتیبی که عرض کردم خدمت دوستان.
واقعا ممنون میشم که به من لطف کنین.

سلام
دوست عزیز یه تکونی هم به خودت بده
در کدی که جناب open-source نوشتن میتوانید بجای مربع از مستطیل استفاده کنید یا اینکه در کد که من نوشتم hwnd یه شکل دایره ای رو بدهید.

saber187518
چهارشنبه 05 خرداد 1389, 02:25 صبح
با سلام
من از پست های شما قدر دانی میکنم.
باور کنید دیگه خودمو تکوندم. من هنوز توی هیچ برنامه ای اینقدر گیر نزدم. حالا یا طرز فکرم برا ایم مسئله اشتباه هست. یا اینکه کلا فکرم اشتباهه و یا اینکه ...

سلام
دوست عزیز یه تکونی هم به خودت بده
در کدی که جناب open-source نوشتن میتوانید بجای مربع از مستطیل استفاده کنید یا اینکه در کد که من نوشتم hwnd یه شکل دایره ای رو بدهید.
اگر درست منظورتون رو متوجه شده باشم. باید به جای rect بنویسم circle. که البته تست کردم error داد.
امکان داره کمی بیشتر راهنمایی بفرمایید.
ممنون.

Hossein Bazyan
چهارشنبه 05 خرداد 1389, 12:21 عصر
با سلام
من از پست های شما قدر دانی میکنم.
باور کنید دیگه خودمو تکوندم. من هنوز توی هیچ برنامه ای اینقدر گیر نزدم. حالا یا طرز فکرم برا ایم مسئله اشتباه هست. یا اینکه کلا فکرم اشتباهه و یا اینکه ...

اگر درست منظورتون رو متوجه شده باشم. باید به جای rect بنویسم circle. که البته تست کردم error داد.
امکان داره کمی بیشتر راهنمایی بفرمایید.
ممنون.

سلام
شما در چه محدوه ای میخواهید حبس بشه ؟
درون شکل یا فرمی به شکل دایره یا چی ؟
اون دایره ای رو که میخوای ماوس درش محبوس بشه چیه ؟ رسم شده یا شکله ؟
در ضمن برای محدود کردن در محدوده مثلا تکست میتوان به شکل زیر عمل کرد


Windows.Forms.Cursor.Clip = txtUserName.RectangleToScreen(txtUserName.ClientRe ctangle)

و برای آزادسازی هم


Cursor.Clip = Nothing

Open-Source
چهارشنبه 05 خرداد 1389, 13:13 عصر
با سلام
من از پست های شما قدر دانی میکنم.
باور کنید دیگه خودمو تکوندم. من هنوز توی هیچ برنامه ای اینقدر گیر نزدم. حالا یا طرز فکرم برا ایم مسئله اشتباه هست. یا اینکه کلا فکرم اشتباهه و یا اینکه ...

اگر درست منظورتون رو متوجه شده باشم. باید به جای rect بنویسم circle. که البته تست کردم error داد.
امکان داره کمی بیشتر راهنمایی بفرمایید.
ممنون.

نه دوست عزیز.
این مشخصه فقط rectangle میگیره.
فکر کنم باید دست به دامن همون API ها شی.