الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إبطال عمل Ctrl+c

مغلق
بدأه Tony_Shaowy في 14 يناير 2002 · 2 رد · 728 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد صممت برنامج يقوم بعرض نصوص باستخدام RichTextBox ولكن المشكلة هي:

كيف أمنع المستخدم من عمل Copy عن الجزء المحدد من النص المعروض في RichTextBox.

لقد وضعت خاصية AutoVerbMenu=False ولكن المستخدم بإمكانه بكل سهولة استخدام Ctrl+C بعد تحديد النص ...

خاصية Enable=False حلت المشكلة مع النصوص الصغيرة ولكن عندما يكون النص كبير فلا استطيع إستخدام ScrollBar ...

خاصية Locked=True منعت المستخدم من التعديل على النص المعروض ولكن لم تمنعه عن اجراء Copy ...

بمعنى آخر كيف أُعطل أمر Ctrl+C عند تشغيل البرنامج وطبعاً كيف أعيد تشغيل الأمر Ctrl+C بعد إنهاء البرنامج

فما الحل برأيكم دام فضلكم ...

أرجو الرد السريع ولكم الشكر ...

:cool:

#2
Private Sub RichTextBox1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = Asc("C") Or KeyCode = Asc("X") And Shift = 2 Then
    KeyCode = 0
    Clipboard.Clear
End If
End Sub

(f) (f)

#3

ما ذكره الأخ/programmer2001 صحيح، ايضا يجب اغلاق زري ctrl وInsert والتي تعد الطريقة الصحيحة للنسخ.. بنفس الطريقة التي ذكرها الاخ في رده

If KeyCode = 45 And Shift = 2 Then
 KeyCode = 0
 Clipboard.Clear
End If

والطريقة السابقة تعتمد على فكرتها على تتبع الاحداث بعد حدوثها اي ان المستخدم نقر زري Ctrl+C وقام النظام بعملية النسخ إلى الحافظة وقد قمنا بعد ذلك بمسح القيمة الموجودة في الحافظة.. ويوفر فيجوال بيسك منذ اصداره الخامس امكانية تطبيق مبدأ التصنيف الفرعي المعتمد عبلى اصطياد الاحداث قبل وقوعها.. لاحظ المثال التالي حيث يتم اصطياد الحدث Key_Down (الرسالة WM_KEYDOWN) قبل وقوعه وبالتالي السيطرة على عملية النسخ،ايضا يمكننا بمنع بقية الازرار من خلال الرسالة WM_CHAR.

في Module (ضروري)

Public Const WM_KEYDOWN = &H100
Public Const WM_CHAR = &H102
Public Const GWL_WNDPROC = (-4)
Public Declare Function SetWindowLong Lib "user32" Alias _
 "SetWindowLongA" (ByVal hwnd As Long, ByVal _
 nIndex As Long, ByVal dwNewLong As Long) _
 As Long
Public 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
Public hPrevWndProc&

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As _
 Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
 Case WM_KEYDOWN
  '
 Case WM_CHAR
  '
 Case Else
  WindowProc = CallWindowProc(hPrevWndProc, hwnd, _
   uMsg, wParam, lParam)
End Select
End Function

في النموذج

Private Sub Form_Load()
  hPrevWndProc = SetWindowLong(RichTextBox1.hwnd, _
   GWL_WNDPROC, AddressOf WindowProc)
End Sub

هذا الموضوع مغلق.

مواضيع مشابهة