Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: clipBOOard Добавлено: 02.08.09 20:03  

Автор вопроса:  VβÐUηìt | Web-сайт: смекаешь.рф
Такое дело. Нужно стырить выделенный текст из контрола, находящегося под фокусом. При этом контрол не принадлежит моей программе. Погуглил кучу всяких примеров с хуками и прочими извратами, вроде приемлемо, но оказалось, что работают они не везде, например, в MsWord или VisualStudio (видимо из-за того, что контролы рисованы заново). Пришел к выводу, что кроме изврата в виде

Clipboard.Clear
keybd_event VK_CONTROL, 0, 0, 0
keybd_event VK_C, 0, 0, 0
keybd_event VK_CONTROL, 0, &H2, 0
keybd_event VK_C, 0, &H2, 0
S = clipboard.GetText

ничего не сделать.

И то это работает через раз (но зато везде :D). Народ плиз помогите, либо как эту васю заставить работать, либо вообще что-то более нормальное)


Заранее благодарен.

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #1 Добавлено: 02.08.09 22:12
Отовсюду текст не вынеш, бывает такое. Сэндмессэйдж с геттекстом пробовал?

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 03.08.09 08:52
Пробовал. Там на то, чтобы добраться до HWND этого контрола кучу кода народ пишет (который вылетает через раз) с хукми и всякой фегней, не то, чтобы на сам сендмесседж. А сендмеседж не работает. Думаю все-таки буфер обмена - самый стабильный вариант. Но если его делать через SendMessage WM_COPY, то нужно узнать hWnd активного контрола, тут тоже встает проблема.

Ответить

Номер ответа: 3
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #3
Добавлено: 03.08.09 10:58
Или есть нормальный способ узнать HWND контрола чужого окна, который находится под фокусом?

Ответить

Номер ответа: 4
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #4 Добавлено: 03.08.09 16:21
Если через апи не считается ненормальным, то есть.
Исключение когда текст это рисунок или контролы недоступны.

Ответить

Номер ответа: 5
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #5
Добавлено: 04.08.09 10:49
АПИ - это очень хорошо, хотелось бы узнать как)) Плиз)

MS Word гад не обрабатывает кажись сообщения GETTEXT и т.п. поэтому я не уверен, что не через буфер обмена получится из него выципить текст.

Ответить

Номер ответа: 6
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #6 Добавлено: 04.08.09 16:14
Применять апи к мсворду както странно, поздним связыванием не легче?
Подключись к модели и командуй.
Пример с апи скину позже.

Ответить

Номер ответа: 7
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #7
Добавлено: 04.08.09 17:03
Спасибо. Суть в том, что мне нужно подрубиться к любому приложению, независимо от того, чем оно является - браузер, блокот, 1С, ворд, переиминование файла - не суть, нужно схавить выделенный текст. С моей точки зрения имитировать нажатие Ctrl+C было бы самым надежным....

Ответить

Номер ответа: 8
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #8 Добавлено: 04.08.09 18:34
[source]Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_GETTEXTLENGTH = &HE
Private Const WM_GETTEXT = &HD
Private Sub Main()
    Dim WindowhWnd As Long
    Dim ObjecthWnd As Long
    Dim lStringLen As Long
    Dim sGetString As String
    WindowhWnd = FindWindow(vbNullString, "Пример.txt - AkelPad")
    ObjecthWnd = FindWindowEx(WindowhWnd, 0, "RichEdit20W", vbNullString)
    lStringLen = SendMessage(ObjecthWnd, WM_GETTEXTLENGTH, 0, 0)
    sGetString = Space$(lStringLen)
    WindowhWnd = SendMessage(ObjecthWnd, WM_GETTEXT, lStringLen, ByVal sGetString)
    MsgBox sGetString
End Sub[\source]
я непонял, ты из окошка с анимацией при копировании файла хочешь текст через Ctrl+C выхватить? Это непрокатит, лэбэлы клипборд не поддерживают.

Ответить

Номер ответа: 9
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #9
Добавлено: 05.08.09 07:50
Благодарю, но это не совсем то ))) Хотя попробовать можно.
я непонял, ты из окошка с анимацией при копировании файла хочешь текст через Ctrl+C выхватить? Это непрокатит, лэбэлы клипборд не поддерживают

Нет, моя задача такова: юзер во время работы с программой (любой) выделил текст. Задача моего кода - узнать этот текст. Именно поэтому я склоняюсь к Ctrl+C.

Ответить

Номер ответа: 10
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #10 Добавлено: 05.08.09 09:03
Ну если только выделенный текст, то да.

Ответить

Номер ответа: 11
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #11
Добавлено: 05.08.09 14:51
Попа в том, что код
  1. Clipboard.Clear
  2. keybd_event VK_CONTROL, 0, 0, 0
  3. keybd_event VK_C, 0, 0, 0
  4. keybd_event VK_CONTROL, 0, &H2, 0
  5. keybd_event VK_C, 0, &H2, 0
  6. S = clipboard.GetText

не работает. Говорит, буфер обмена не может открыть.

Ответить

Номер ответа: 12
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #12
Добавлено: 11.08.09 11:25
Не, серьезно народ, я что, упустил какую-то очевидную деталь?

Ответить

Номер ответа: 13
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #13
Добавлено: 11.08.09 11:46
Сейчас перебором посмотрел,
  1.  
  2. Call keybd_event(VK_SPACE, 0, 0, 0)
  3. Sleep (10)
  4. Call keybd_event(VK_SPACE, 0, 2, 0)


Работает.

  1.  
  2. Call keybd_event(VK_C, 0, 0, 0)
  3. Sleep (10)
  4. Call keybd_event(VK_C, 0, 2, 0)


 Не работает.

Непонятно.

Ответить

Номер ответа: 14
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #14
Добавлено: 11.08.09 11:56
Убицо об стену. Всем, кто сюда зашел, ища почему не работает keybd_event:

Вторым параметром нужно передавать то, что ты нажимаешь, обрабатывая функцией MapVirtualKey.
  1.  
  2. keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0
  3. keybd_event VK_C, MapVirtualKey(VK_C, 0), 0, 0
  4. Sleep (1)
  5. keybd_event VK_C, MapVirtualKey(VK_C, 0), &H2, 0
  6. keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), &H2, 0



:)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам