Разное

Буфер обмена vb net – Запись данных в буфер обмена и чтение их оттуда (Visual Basic)

Запись данных в буфер обмена и чтение их оттуда (Visual Basic)

  • Время чтения: 2 мин

В этой статье

Буфер обмена можно использовать для хранения данных, таких как текст и изображения.The Clipboard can be used to store data, such as text and images. Поскольку буфер обмена используется всеми активными процессами, с его помощью можно передавать данные из одного процесса в другой.Because the Clipboard is shared by all active processes, it can be used to transfer data between them. Объект My.Computer.Clipboard позволяет легко обращаться к буферу обмена, считывать из него данные и выполнять в него запись.The My.Computer.Clipboard object allows you to easily access the Clipboard and to read from and write to it.

Чтение из буфера обменаReading from the Clipboard

Используйте метод GetText для чтения текста из буфера обмена.Use the GetText method to read the text in the Clipboard. Код в следующем примере считывает текст и отображает его в окне сообщения.The following code reads the text and displays it in a message box. Для правильной работы этого кода буфер обмена должен содержать какой-либо текст.There must be text stored on the Clipboard for the example to run correctly.

MsgBox(My.Computer.Clipboard.GetText())

Этот пример кода также доступен в качестве фрагмента кода IntelliSense.This code example is also available as an IntelliSense code snippet. В средстве выбора фрагмента кода он расположен в разделе Приложения Windows Forms > Буфер обмена.In the code snippet picker, it is located in Windows Forms Applications > Clipboard. Дополнительные сведения см. в статье Фрагменты кода.For more information, see Code Snippets.

Используйте метод GetImage для извлечения изображения из буфера обмена.Use the GetImage method to retrieve an image from the Clipboard. Код в этом примере проверяет наличие изображения в буфере обмена, прежде чем извлекать его и назначать PictureBox1.This example checks to see if there is an image on the Clipboard before retrieving it and assigning it to PictureBox1.

If My.Computer.Clipboard.ContainsImage() Then
  Dim grabpicture As System.Drawing.Image
  grabpicture = My.Computer.Clipboard.GetImage()
  picturebox1.Image = grabpicture
End If

Этот пример кода также доступен в качестве фрагмента кода IntelliSense.This code example is also available as an IntelliSense code snippet. В средстве выбора фрагмента кода он расположен в разделе Приложения Windows Forms > Буфер обмена. Дополнительные сведения см. в разделе Фрагменты кода.In the code snippet picker, it is located in

Windows Forms Applications > Clipboard.For more information, see Code Snippets.

Элементы, добавленные в буфер обмена, сохраняются даже после того, как работа приложения завершается.Items placed on the Clipboard will persist even after the application is shut down.

Определение типа файла, хранящегося в буфере обменаDetermining the type of file stored in the Clipboard

В буфере обмена могут храниться данные в различных форматах, включая тексты, звуковые файлы и изображения.Data on the Clipboard may take a number of different forms, such as text, an audio file, or an image. Чтобы определить, файл какого типа содержится в буфере обмена, можно использовать такие методы как ContainsAudio, ContainsFileDropList, ContainsImage и ContainsText.In order to determine what sort of file is on the Clipboard, you can use methods such as ContainsAudio, ContainsFileDropList, ContainsImage, and ContainsText. Если вы используете для проверки пользовательский формат файла, можно использовать метод ContainsData.The ContainsData method can be used if you have a custom format that you want to check.

Функция ContainsImage позволяет определить, являются ли данные в буфере обмена изображением.Use the ContainsImage function to determine whether the data contained on the Clipboard is an image. Следующий код проверяет, являются ли данные изображением, и выдает соответствующий отчет.The following code checks to see whether the data is an image and reports accordingly.

If My.Computer.Clipboard.ContainsImage() Then
    MsgBox("Clipboard contains an image.")
Else
    MsgBox("Clipboard does not contain an image.")
End If

Очистка буфера обменаClearing the Clipboard

Метод Clear очищает буфер обмена.The Clear method clears the Clipboard. Поскольку буфер обмена используют и другие процессы, очищение буфера может плохо на них повлиять.Because the Clipboard is shared by other processes, clearing it may have an impact on those processes.

В следующем примере кода демонстрируется применение метода Clear

.The following code shows how to use the Clear method.

My.Computer.Clipboard.Clear()

Запись в буфер обменаWriting to the Clipboard

Используйте метод SetText для записи текста в буфер обмена.Use the SetText method to write text to the Clipboard. Следующий код записывает в буфер обмена строку «This is a test string» (Это — тестовая строка).The following code writes the string «This is a test string» to the Clipboard.

My.Computer.Clipboard.SetText("This is a test string.")

Метод SetText может принимать параметр формата, который содержит тип TextDataFormat.The SetText method can accept a format parameter that contains a type of TextDataFormat. Следующий код записывает строку «This is a test string» (Это — тестовая строка) в буфер обмена в формате RTF.The following code writes the string «This is a test string» to the Clipboard as RTF text.

My.Computer.Clipboard.SetText("This is a test string.", System.Windows.Forms.TextDataFormat.Rtf)

Используйте метод SetData для записи данных в буфер обмена.Use the SetData method to write data to the Clipboard. Код в этом примере записывает DataObject dataChunk в буфер обмена в пользовательском формате specialFormat.This example writes the DataObject dataChunk to the Clipboard in the custom format specialFormat.

My.Computer.Clipboard.SetData("specialFormat", dataChunk)

Используйте метод SetAudio для записи звуковых данных в буфер обмена.Use the SetAudio method to write audio data to the Clipboard. Код в этом примере создает массив байтов musicReader, считывает в него файл cool.wav и записывает его в буфер обмена.This example creates the byte array musicReader, reads the file

cool.wav into it, and then writes it to the Clipboard.

Dim musicReader = My.Computer.FileSystem.ReadAllBytes("cool.wav")
My.Computer.Clipboard.SetAudio(musicReader)

Важно!

Поскольку к буферу обмена могут обращаться другие пользователи, не храните в нем конфиденциальные данные, включая пароли.Because the Clipboard can be accessed by other users, do not use it to store sensitive information, such as passwords or confidential data.

См. такжеSee also

docs.microsoft.com

Обнаружение изменения текста буфера обмена с поддержкой юникода в vb.net

iam, используя приведенный ниже код, чтобы проверить изменение текста в буфере обмена, но его не поддерживают с помощью юникодовых символов, таких как ا ب ج, есть ли способ добавить поддержку текста в формате Unicode или есть другой способ сделать то же самое?

#Region " Definitions " 
    'Constants for API Calls... 
    Private Const WM_DRAWCLIPBOARD As Integer = &h408 
    Private Const WM_CHANGECBCHAIN As Integer = &h40D 
    'Handle for next clipboard viewer... 
    Private mNextClipBoardViewerHWnd As IntPtr 
    'API declarations... 
    Declare Auto Function SetClipboardViewer Lib "user32" (ByVal HWnd As IntPtr) As IntPtr 
    Declare Auto Function ChangeClipboardChain Lib "user32" (ByVal HWnd As IntPtr, ByVal HWndNext As IntPtr) As Boolean 
    Declare Auto Function SendMessage Lib "User32" (ByVal HWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long 
#End Region 

#Region " Contructor " 
#End Region 

#Region " Message Process " 
    'Override WndProc to get messages... 
    Protected Overrides Sub WndProc(ByRef m As Message) 
     Dim iData As IDataObject = New DataObject() 
     iData = Clipboard.GetDataObject() 
     Select Case m.Msg 

      Case Is = WM_DRAWCLIPBOARD 'The clipboard has changed... 
       '########################################################################## 
       ' Process Clipboard Here :)........................ 
       '########################################################################## 
       MsgBox(CStr(iData.GetData(DataFormats.Text))) 
       SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam) 

      Case Is = WM_CHANGECBCHAIN 'Another clipboard viewer has removed itself... 
       If m.WParam = CType(mNextClipBoardViewerHWnd, IntPtr) Then 
        mNextClipBoardViewerHWnd = m.LParam 
       Else 
        SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam) 
       End If 
     End Select 

     MyBase.WndProc(m) 
    End Sub 
#End Region 

#Region " Dispose " 
    'Form overrides dispose to clean up... 
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) 
     If disposing Then 
      'Set the next clipboard viewer back to the original... 
      ChangeClipboardChain(Me.Handle, mNextClipBoardViewerHWnd) 
      MyBase.Dispose(disposing) 
     End If 
    End Sub 

vb.net unicode clipboard2,063

stackoverrun.com

Datagridview для оптимизации буфера обмена

Я не спрашиваю, как скопировать datagrid в мой буфер обмена, но больше оптимизации моего кода.

Это то, что я должен скопировать мой datagridview в свой буфер обмена, чтобы я мог вставить его содержимое в excel.

Dim dgv As DataGridView = dgvData 
    Dim s As String = "" 
    Dim oCurrentCol As DataGridViewColumn 'Get header 
    oCurrentCol = dgv.Columns.GetFirstColumn(DataGridViewElementStates.Visible) 
    oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None) 

    Do 
     s &= oCurrentCol.HeaderText & Chr(Keys.Tab) 
     oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None) 
    Loop Until oCurrentCol Is Nothing 

    s = s.Substring(0, s.Length - 1) 
    s &= Environment.NewLine 'Get rows 
    For Each row As DataGridViewRow In dgv.Rows 
     oCurrentCol = dgv.Columns.GetFirstColumn(DataGridViewElementStates.Visible) 
     oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None) 
     Do 
      If row.Cells(oCurrentCol.Index).Value IsNot Nothing Then 
       s &= row.Cells(oCurrentCol.Index).Value.ToString 
      End If 
      s &= Chr(Keys.Tab) 
      oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None) 
     Loop Until oCurrentCol Is Nothing 
     s = s.Substring(0, s.Length - 1) 
     s &= Environment.NewLine 
    Next 'Put to clipboard 

    Dim o As New DataObject 
    o.SetText(s) 
    Clipboard.SetDataObject(o, True) 

Это отлично работает! Делает именно то, что я хочу, чтобы делать это, в том числе оставляя первую колонку, и отлично смотрится при вставке в excel.

Теперь проблема, с которой я сталкиваюсь, это очень медленно. На моем компьютере разработки потребуется около двух минут, чтобы скопировать ~ 10 000 строк из 10 столбцов. На некоторых наших старых серверах я позволял ему работать более десяти минут и в итоге просто убил процесс, потому что он занимал так много времени.

Я не знаю, что я мог сделать, чтобы ускорить процесс. Любая помощь приветствуется!

Спасибо!

stackoverrun.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *