none
Имитация Ctrl+V в WPF RRS feed

  • Вопрос

  • Ужас, уже 3 часа ищу, ничего не получается. Нужно вставить текст из буфера обмена как при нажатии Ctrl+V в то место, где стоит курсор. Имя элемента, где в данный момент курсор неизвестно. Как это сделать? Или может можно не с буфера вывести текст, а программно нажать клавиши на клавиатуре... помогите пожалуйста.
    28 июля 2012 г. 16:53

Ответы

  • тогда может есть похожая функция, отвечающая за нажатие кнопок клавиатуры?

    Само собой есть. Это setkeyboardstate, но есть еще вариант с SendKeys. Только для него нужно будет подключить пространство имен System.Windows.Forms и учитывать маленькую загвоздку. Если язык ввода в приложении куда нужно послать клавиши стоит русский, то строка в SendKeys должна выглядеть так "^(м)", а если английский, то так "^(v)" .

    Выбирайте что вам больше подходит.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Siompc 2 января 2013 г. 18:07
    29 июля 2012 г. 14:11
    Отвечающий

Все ответы

  • Добрый день.

    Ваш вопрос не очень понятен. Если у вас курсор стоит в TextBox или RichTextBox, то текст из буфера по нажатию Ctrl+V и так вставится. Если вы хотите вставлять текст из буфера, например, в качестве контента кнопки, то это чуть сложнее, но тоже возможно. Так что вы хотите получить?

    29 июля 2012 г. 5:53
    Отвечающий
  • Курсор может стоять не в форме, а в блокноте например. И программа должна имитировать нажатие. Пользователь не сам должен нажимать Ctrl+V а программа. 
    29 июля 2012 г. 11:18
  • Если вы хотите логику:

    1. Открыли блокнот.

    2. Открыли Word, написали текст, скопировали его в буфер отмена.

    3. Запустили свою программу.

    4. Нажали Ctrl+V, и у вас что то вставилось в блокнот....

    То так в лоб не получится. У вас открыто может быть много программ. В каждой из них, будет компонент который получал фокус последним. На основании какого признака, вы хотите выбирать окно, куда хотите принудительно вставить из буффера что-то?

    29 июля 2012 г. 11:28
    Отвечающий
  • Так... в программе при нажатию кнопки происходит следующее...

    Копируется нужный текст - Clipboard.SetText("Текст..."), курсор сам (!) наводится на нужную форму и кликает левой кнопкой мыши. Теперь программа сама должна вставить туда текст из буфера, как будто пользователь нажал Ctrl+V. Или имитировать нажатие клавишь "Т", "е", "к", "с", "т". Вот что нужно. Если есть API функция указания координат курсора и клика клавишами мыши, тогда может есть похожая функция, отвечающая за нажатие кнопок клавиатуры?


    • Изменено Siompc 29 июля 2012 г. 11:37
    29 июля 2012 г. 11:36
  • тогда может есть похожая функция, отвечающая за нажатие кнопок клавиатуры?

    Само собой есть. Это setkeyboardstate, но есть еще вариант с SendKeys. Только для него нужно будет подключить пространство имен System.Windows.Forms и учитывать маленькую загвоздку. Если язык ввода в приложении куда нужно послать клавиши стоит русский, то строка в SendKeys должна выглядеть так "^(м)", а если английский, то так "^(v)" .

    Выбирайте что вам больше подходит.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Siompc 2 января 2013 г. 18:07
    29 июля 2012 г. 14:11
    Отвечающий
  • API работать не хочет...

    Private Declare Function SetKeyboardState Lib "user32" (ByVal lppbKeyState As Byte) As Long
        Private Declare Function GetKeyboardState Lib "user32" (ByVal pbKeyState As Byte) As Long
    
     Private Function SetKeyState(ByVal virtualKey As Integer, ByVal turnOn As Boolean) As Long
            ' Retrieve the keyboard state, set the particular key in which you're interested, and then set  
            ' the entire keyboard state back the way it was, with the one key altered.  
            Dim aKeys(0 To 255) As Byte
            GetKeyboardState(aKeys(0))
            Select Case turnOn
                Case True
                    aKeys(virtualKey) = CByte(1)
                Case Else
                    aKeys(virtualKey) = CByte(0)
            End Select
            Return SetKeyboardState(aKeys(0))
        End Function
    
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button3.Click
          
            SetKeyState(Key.CapsLock, True)
          
        End Sub

    При нажатии на кнопку, все равно пишет прописными. А SendKeys пробовал уже. Посылаю текст - "asd d dsa", в форме отображает только два пробела и все ))

    29 июля 2012 г. 15:09
  • Скачайте программу ApiViewer 2004. Хорошая штука тем, что дает код в VB.Net на каждую выбранную функцию, а так же все зависимости, включая типы и константы. В общем, разберетесь, она не сложная.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    29 июля 2012 г. 15:53
    Отвечающий
  • Спасибо. Заменил на следующее

    Private Declare Function SetKeyboardState Lib "user32.dll" (ByRef lppbKeyState As Byte) As Long
        Private Declare Function GetKeyboardState Lib "user32.dll" (ByRef pbKeyState As Byte) As Long

    Работать все равно отказывается :)

    29 июля 2012 г. 16:41
  • http://vbzero.narod.ru/chapter2/page_4.htm сказано что начиная с XP работать не будет... есть еще какие нибудь варианты?
    29 июля 2012 г. 16:48
  • Привет.

    А обычная работа с буфером обмена через стандартный класс Clipboard не подходит?

                if (Clipboard.ContainsText())
                {
                    string text = Clipboard.GetText();
                    textBox1.Text = text;
                }

    А по имитации ввода посмотрите библиотеку для WPF - Windows Input Simulator (C# SendInput Wrapper - Simulate Keyboard and Mouse)

    Для связи [mail]

    15 августа 2012 г. 8:20
  •  SendKeys помогло :) Спасибо!
    2 января 2013 г. 18:07