2013-06-11 35 views
7

Khi tôi thực hiện tìm kiếm thông qua toàn bộ dự án của tôi trong studio trực quan cho từ 'clipboard' tôi không tìm thấy kết quả phù hợp nào.Nhấp đúp vào Điều khiển nhãn .NET sao chép văn bản của nó vào khay nhớ tạm trên Vista +?

Tuy nhiên, chương trình của tôi dường như đang thay đổi nội dung trong khay nhớ tạm của tôi bằng với thuộc tính .text của điều khiển trên biểu mẫu của tôi. Làm sao có thể?

Tôi đã xác định trình xử lý mà sau đó khay nhớ tạm của tôi dường như luôn thay đổi và thêm hộp thông báo để lấy văn bản từ khay nhớ tạm của tôi để thử và xác định khi nào có thể thay đổi.

MessageBox.Show(Clipboard.GetText) 

Ngay cả ở trên cùng của phụ xử lý sự kiện, khay nhớ tạm của tôi đã được thay đổi thành thuộc tính .text của điều khiển. Đây là phụ duy nhất xử lý sự kiện này và clipboard luôn thay đổi sau sự kiện này.

Đây là dự án winforms nhỏ được viết bằng vb.net.

Thông tin khác:

Khay nhớ tạm của tôi được đặt thành thuộc tính .text của nhãn khi tôi nhấp vào. Các nhãn được thực hiện ở đây:

For i = 0 To lstTupChildren.Count - 1 
    Dim lbl As New Label() 
    lbl.Size = New System.Drawing.Size(250, 25) 
    lbl.Font = New System.Drawing.Font("Calibri (body)", 10) 
    lbl.Text = i + 1 & ". " & lstTupChildren(i).Item1 
    lbl.Location = New System.Drawing.Point(0, 25 * i) 
    If lstTupChildren(i).Item3 = True Then lbl.BackColor = Color.GreenYellow Else lbl.BackColor = Color.Orange 'sets the colour depending on whether the timesheet is active' 
     Me.Controls.Add(lbl) 
     AddHandler lbl.DoubleClick, AddressOf subChangeTimesheetState 'adds handler for double click to change status 
     'adds handlers for moving the overlay 
     AddHandler lbl.MouseDown, AddressOf Form_MouseDown 
     AddHandler lbl.MouseMove, AddressOf Form_MouseMove 
     'adds handler for hide context menu' 
     AddHandler lbl.MouseClick, AddressOf subRightClickMenu 

    Next 

ngay cả khi tôi nhận xét ra xử lý: AddHandler lbl.DoubleClick, AddressOf subChangeTimesheetState

clipboard của tôi vẫn còn thay đổi.

làm việc xung quanh có sẵn ở đây: Làm việc quanh đây: http://www.aspnet-answers.com/microsoft/NET-WinForms-Controls/32231136/double-click-label-and-its-text-appears-on-the-clipboard.aspx

Tạo một lớp mới kế thừa nhãn, mã vb:

Công Lớp mylabel

Inherits Label 
Private WM_GETTEXT As Integer = &HD 
Private WM_LBUTTONDBLCLK As Integer = &H203 
Private doubleclickflag As Boolean = False 
Protected Overrides Sub WndProc(ByRef m As Message) 
    If m.Msg = WM_LBUTTONDBLCLK Then 
     doubleclickflag = True 
    End If 
    If m.Msg = WM_GETTEXT AndAlso doubleclickflag Then 
     doubleclickflag = False 
     Return 
    End If 
    MyBase.WndProc(m) 
End Sub 

End Class

+0

Vì vậy, nếu bạn loại bỏ các xử lý, nó không thay đổi? –

+1

Loại điều khiển nào? Chỉ cần một hộp văn bản hoặc cái gì khác? –

+0

đó là một câu hỏi tuyệt vời @ZachJohnson – 5uperdan

Trả lời

12

Nó không phải là mã của bạn, nó là một "tính năng" được giới thiệu trong Windows Vista.

Trong Windows Vista, một lập trình viên Windows Shell đã kiểm tra thay đổi (không có chỉ định/biện minh trong danh sách thay đổi) đã thay đổi điều khiển nhãn mặc định để sao chép văn bản vào clipboard khi nhấp đúp.

Thay đổi này thường không ảnh hưởng đến ứng dụng C++ do cách chúng tạo/lưu trữ kiểm soát nhãn, nhưng nó tác động đến tất cả các ứng dụng VS.NET. Tôi đã gửi một lỗi chống lại nhóm khung (ngạc nhiên) khi tôi phát hiện ra điều này trong khung thời gian Win7, nhưng họ sợ phải sửa lỗi vì nó đã tồn tại quá lâu.

Đây là trùng lặp Is there any way to disable the "double-click to copy" functionality of a .NET label?

+1

OMG IT'S TRUE! TÔI ĐÃ CHỜ Tôi KHÔNG THỂ TẮT CAPSLOCK OFF. – 5uperdan

+0

+1. Một tính năng tuyệt vời! Tôi không biết bạn có thể làm điều đó. Không hoạt động trên lớp hộp thông báo, có lẽ vì nó là COM dưới mui xe. – Neolisk

+0

FWIW: Tôi không nghĩ MessageBox sử dụng COM ở tất cả; bạn có thể gọi nó trong một ứng dụng không bao giờ gọi CoInitialize. – EricLaw

4

Cách tốt nhất để có được những nhãn không phản ứng trên một nhấp chuột kép là để ghi đè lên phong cách đẳng cấp bằng cách ghi đè lớp nhãn riêng của mình.

private class SingleClickLabel : Label 
    { 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); 

       CreateParams cp = base.CreateParams; 
       cp.ClassStyle &= ~0x0008; 
       cp.ClassName = null; 

       return cp; 
      } 
     } 
    } 

Điều này sẽ loại bỏ kiểu lớp cửa sổ CS_DBLCLKS khỏi nhãn. Sự kiện duy nhất sẽ được kích hoạt từ bây giờ là sự kiện Nhấp cho mỗi nhấp chuột xảy ra.

Xem: http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.createparams(v=vs.110).aspx

+0

Điều gì sẽ xảy ra nếu vấn đề là nhấp đúp vào nhãn là _required_ trong chương trình trong một số trường hợp nhất định, nhưng tôi không muốn xóa nó trong clipboard? Hãy suy nghĩ bảng màu trong chương trình chỉnh sửa hình ảnh mở bộ chọn màu khi nhấp đúp. – Nyerguds

1

Tôi cho rằng có một số cách khác nhau để giải quyết vấn đề này như vậy. Dưới đây là những gì tôi đã đưa ra (sử dụng một nhãn được thừa kế, thử nghiệm trên Windows Server 2012 R2):

public class MyLabel : System.Windows.Forms.Label 
{ 
    private const int WM_LBUTTONDBLCLK = 0x203; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONDBLCLK) 
     { 
      string sSaved = Clipboard.GetText(); 
      System.Drawing.Image iSaved = Clipboard.GetImage(); 
      base.WndProc(ref m); 
      if (iSaved != null) Clipboard.SetImage(iSaved); 
      if (!string.IsNullOrEmpty(sSaved)) Clipboard.SetText(sSaved); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

Một số nỗ lực sẽ phải được đầu tư để bảo toàn những thứ như các lĩnh vực Excel sao chép và những thứ tương tự, mặc dù nguyên tắc sẽ giống nhau. Như đã đề cập, bạn có thể lặp qua clipboard cho tất cả các định dạng có sẵn (hoặc những cái mà bạn quan tâm), và đưa những giá trị đó vào một đối tượng Dictionary, và sau đó khôi phục chúng sau từ. Văn bản và bức ảnh bao gồm nó cho tôi, trong trường hợp này.

Một liên kết có giá trị để xem về chủ đề này là ở đây: How do I backup and restore the system clipboard in C#?

Các vấn đề liên quan