PDA

View Full Version : کلیک راست



sehm67
سه شنبه 22 آذر 1390, 23:07 عصر
سلام

می خوام تو برنامه از کلیک راست بر روی تکست باکس ها جلوگیری کنم.


Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then MsgBox "کليک راست ممنوع"
End Sub

من نمی خوام از کد بالا استفاده کنم می خوام وقتی کاربر روی تکست باکس کلیک راست می کنه گزینه های Paste , Copy , Cute و ... غیر فعال بشن .

ممنون از دوستان.

محسن واژدی
پنج شنبه 24 آذر 1390, 22:53 عصر
سلام
راههای مختلفی وجود دارد، که مطمئن ترین آنها sub-classing است
برای اینکار یک ماژول به برنامه اضافه و کدهای زیر را در آن کپی کنید:

Option Explicit
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Private lPProc&
Public Sub OldWindowProc(tTextBox As TextBox)
lPProc& = SetWindowLong(tTextBox.hWnd, GWL_WNDPROC, AddressOf NoPopupWindowProc)
End Sub

Private Function NoPopupWindowProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CONTEXTMENU = &H7B
Const WM_DESTROY = &H2

If msg = WM_CONTEXTMENU Then
Exit Function
ElseIf msg = WM_DESTROY Then
SetWindowLong hWnd, GWL_WNDPROC, lPProc&
Else
NoPopupWindowProc = CallWindowProc(lPProc&, hWnd, msg, wParam, lParam)
End If

End Function



استفاده:
Private Sub Form_Load()
Call OldWindowProc(Text1)
End Sub


البته توجه داشته باشین که در استفاده از توابع هوک احتمال بسته شدن ناگهانی وی بی وجود دارد، پس برای جلوگیری از این اتفاق حتما از دستور unload یا فشردن کلید Close برای بستن برنامه استفاده کنید تا دستور یا دکمه End

موفق باشید

IamOverlord
جمعه 25 آذر 1390, 19:29 عصر
اگر بخوایم این کارو برای Web Browser بکنیم چی؟

محسن واژدی
جمعه 25 آذر 1390, 19:48 عصر
سلام
کامپوننتی است بنام EventVB.dll حاوی قابلیت های بسیار مفید، از جمله غیرفعال کردن منوی راست کلیک webbrowser
در انجمن جستجو کنید، قبلا برای یکی از عزیزان قرار دادم

موفق باشید

ROSTAM2
جمعه 11 آذر 1401, 14:18 عصر
سلام
راههای مختلفی وجود دارد، که مطمئن ترین آنها sub-classing است
برای اینکار یک ماژول به برنامه اضافه و کدهای زیر را در آن کپی کنید:

Option Explicit
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Private lPProc&
Public Sub OldWindowProc(tTextBox As TextBox)
lPProc& = SetWindowLong(tTextBox.hWnd, GWL_WNDPROC, AddressOf NoPopupWindowProc)
End Sub

Private Function NoPopupWindowProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_CONTEXTMENU = &H7B
Const WM_DESTROY = &H2

If msg = WM_CONTEXTMENU Then
Exit Function
ElseIf msg = WM_DESTROY Then
SetWindowLong hWnd, GWL_WNDPROC, lPProc&
Else
NoPopupWindowProc = CallWindowProc(lPProc&, hWnd, msg, wParam, lParam)
End If

End Function



استفاده:
Private Sub Form_Load()
Call OldWindowProc(Text1)
End Sub


البته توجه داشته باشین که در استفاده از توابع هوک احتمال بسته شدن ناگهانی وی بی وجود دارد، پس برای جلوگیری از این اتفاق حتما از دستور unload یا فشردن کلید Close برای بستن برنامه استفاده کنید تا دستور یا دکمه End

موفق باشید

سلام ب همه.
من می خوام تابع SetWindowLong رو در VB.Net استفاده کنم اما مشکلی که هست برای ورودی dwNewLong AsLong دستور AddressOf رو پشتیبانی نمی کنه آیا نحوه استفاده از تابع در VB.Net تغییر کرده یا باید از تابع API دیگه ای استفاده بشه؟