سلام
چگونه می توان موس را در برنامه فعال یا غیر فعال نمود؟
سلام
چگونه می توان موس را در برنامه فعال یا غیر فعال نمود؟
Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long)
Show mouse:
ShowCursor (1)
hide mouse:
ShowCursor (0)
با تشکر از شما دوست عزیز
روش خوب و ساده ای است ولی در این روش فقط موس ظاهر یا مخفی میشود ولی فعال یا غیر فعال نمی شود مثلا فرض کنید اگه در زمان load برنامه موس را مخفی کردیم و بعد از اجرابر روی فرم کلیک کنیم (اگر دارای کد باشد)eventمربوطه اجرا خواهد شددر حالی که من نمی خواهم این عمل انجام شودوواقعا می خواهم موس را فعال یا غیر فعال کنم
با تشکر
من تنها کدی که به نظرم میرسه استفاده از دو API هست که یکی همون تابع معرفی شده در بالا هست:
Private Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long)
و دیگری تابع زیر میباشد:
Private Declare Sub ClipCursor Lib "user32" (lpRect As Any)
همونطور که در بالا گفتید ShowCursor کار نمایش و مخفی کردن موس را انجام میدهد و ClipCursor کار محدود کردن حرکت موس.
در ClipCursor متغیر lpRect به یک ساختار به نام Rect اشاره میکنه که این ساختار تشکیل شده است از فیلدهای زیر :
Top : مختصات گوشه بالای چهار گوش
Bottom : مختصات گوشه پایین چهار گوش
Left : مختصات گوشه چپ چهار گوش
Right : مختصات گوشه راست چهار گوش
در کد زیر نحوه استفاده از ClipCursor را نشان میدهد. این کد باعث میشود که حرکت موس به چهار گوشی در محدوده (200و200) و (150و150) محدود شود.
** برای اجرای برنامه زیر دو CommandButton به نام cmdenable و cmddisable قرار دهید که اولین دکمه کار محدود سازی و دیگری عمل برگرداندن به حالت عادی را انجام میدهد.
Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
Private Declare Sub ClipCursor Lib "user32" (lpRect As Any)
Private Sub Cmddisable_Click()
Dim Rectangle As RECT
Rectangle.left = 200
Rectangle.top = 200
Rectangle.right = 150
Rectangle.bottom = 150
ClipCursor Rectangle
End Sub
Private Sub CmdEnable_Click()
ClipCursor ByVal 0&
End Sub
حال اگر مختصاتهای داده شده را برابر با صف قرار دهیم یعنی :
Rectangle.left = 0
Rectangle.top = 0
Rectangle.right = 0
Rectangle.bottom = 0
نشانگر موس به گوشه بالا و سمت راست صفحه نمایش رفته و محدود به همان نقطه یعنی (0و0) میشود. حالا اگز از تابع ShowCursor& استفاده کنیم میتوانیم موس را در همان محل مخفی کنیم تا دیگر امکان کار کردن موس نباشد.
** دقت کنید که برای بازگرداندن موس به حالت عادی باید از کد زیر استفاده کنید :
ClipCursor ByVal 0&
پس با این حال مد مربوط به انجام اینکار باید چیزی شبیه به کد زیر باشد:
Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
Private Declare Sub ClipCursor Lib "user32" (lpRect As Any)
Private Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long)
Private Sub Cmddisable_Click()
Dim Rectangle As RECT
ShowCursor (0)
Rectangle.left = 0
Rectangle.top = 0
Rectangle.right = 0
Rectangle.bottom = 0
ClipCursor Rectangle
End Sub
Private Sub CmdEnable_Click()
ShowCursor (1)
ClipCursor ByVal 0&
End Sub
راستی کد API دیگری هم برای قفل کردن موس و کیبورد به طور کامل هم وجود دارد که فکر نمیکنم مورد توجه شما باشد (چون با اجرای کد امکان استفاده از کیبورد و موس به طور کامل از بین میرود و به نظر من برنامه ای که نشه در آن نه از کیبورد استفاده کرد و نه از موس دیگه برنامه نیست. مگر آنکه :مخالف: ... .
این API همان BlockInput هست که در صورتی که نیازی به استفاده از آن دارید حتما بگید تا نحوه عمل آن را نیز به طور کامل تشریح کنم.
امیدوارم که مورد رضایت واقع شده باشد. :wink: :wink: :lol:
ممنونم واقعا خیلی زحمت کشید ید که این همه جواب را کامل و با حوصله در اینجا گذاشتیدمن می خواهم موسم روی
msflexgrid نرود میدانم که خاصیت top و leftاراداردولی تا آنجا که به خاطر دارم خاصیت buttomوright را ندارد
با تشکر مجدد
یک کار جالبتر شما میتونید با نوشتن کد زیر در MSFlexGrid1_MouseMove پیغامی به کاربر نشان دهید و عدم امکان حرکت موس را در آن منطقه نمایش دهید :
Private Sub MSFlexGrid1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If botton = 0 Then
MsgBox "You can't move mouse."
End If
End Sub
حالا اگر میخواهید که برای مثال با حرکت کردن موس روی کنترل محل قرارگیری نشانگر در محل خاصی باشد, از کد زیر استفاده کنید:
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Sub MSFlexGrid1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim Point As POINTAPI
Me.ScaleMode = vbPixels
Point.x = 0
Point.y = 0
ClientToScreen MSFlexGrid1.hwnd, Point
If botton = 0 Then
SetCursorPos Point.x, Point.y
End If
End Sub
* این کد دارای دو api دیگر هست که در حال حاضر وقت توضیح دادن تک تک آنها را ندارم. اگر این کد به دردتان خورد و در صورت تمایل بگید تا توصیح بدم. :wink:
دوست عزیزم سلام.
روشی که آقای غیبی گفتن جالب و ساده است. ولی من یه راه ساده تر دارم.
این ActivX به دردت میخوره. کار کردن باهاش خیلی ساده است. درضمن متاسفانه وقت توضیح دادنشو ندارم. ببخشید :oops:
اگه سوالی داشتی بپرس. :)