SendMessage

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хой
Не математик
Не математик
 
Сообщения: 541
Зарегистрирован: 26.08.2002 (Пн) 0:21
Откуда: Россия

SendMessage

Сообщение Хой » 10.03.2003 (Пн) 17:27

Как через SendMessage (зная hWnd) послать техт RithTextBox'у????

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.03.2003 (Пн) 22:32

Кажется, через SendMessage это сделать нельзя. Есть такой вариант: сначала через GetWindowText ищете текст в контроле, а затем через SetWindowText добавляете туда имеющийся текст и новый. По-моему, так.

Хой
Не математик
Не математик
 
Сообщения: 541
Зарегистрирован: 26.08.2002 (Пн) 0:21
Откуда: Россия

Сообщение Хой » 10.03.2003 (Пн) 23:11

Amed писал(а):Есть такой вариант: сначала через GetWindowText ищете текст в контроле, а затем через SetWindowText добавляете туда имеющийся текст и новый. По-моему, так.

Я так пробывал (но просто, через SetWindowText ) но неполучалось!!!
Если не трудно, напиши пример. :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.03.2003 (Вт) 7:08

'Вот код программы:
'Предполагается, что на форме уже расположен TextBox с именем txtText.

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

Private Const STR_SIZE As Integer = 255

'Важно указать границы строки
Private buf As String * STR_SIZE
Private tHwnd As Long

Private Sub Form_Load()
txtText.Text = "Old string"
tHwnd = txtText.hwnd

'Ищем старыый текст
GetWindowText tHwnd, buf, STR_SIZE

'Добавляем в начало новый текст
SetWindowText tHwnd, "New string " & Trim$(buf)

'Добавляем в конец новый текст
'НЕ РАБОТАЕТ'SetWindowText tHwnd, Trim$(buf) & "New string"
End Sub

'Парадокс в том, что у меня на компьютере текст в хвост не добавляется :lol:
'Может, глюк? Попробуй, может быть, у тебя получится...
'Удачи!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.03.2003 (Вт) 18:30

Кстати, есть ещё константа WM_PASTE, если её использовать в SendMessage, то вставится текст из clipboard (буфера обмена).
ИМХО, может быть и такой путь...

Alfa
Бывалый
Бывалый
 
Сообщения: 249
Зарегистрирован: 12.01.2003 (Вс) 20:15
Откуда: Россия, Красноярск

Ответ

Сообщение Alfa » 11.03.2003 (Вт) 20:09

В старом форуме решали этот вопрос. Так что с помощью Get And White, извеняюсь Get And Set нельзя. Так что надо общаться с помощью Send Message

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.03.2003 (Ср) 9:45

В старом форуме вопрос этот не совсем решили :wink:
Во всяком случае, когда я спросил, как из ричтекстбокса другой проги стырить TextRTF, ответа не последовало. :wink:

Так что вопрос остаётся открытым. Как его стырить-то?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 12.03.2003 (Ср) 18:58

'Вот, что я написал:

'На форме должны располагаться:
'1) Таймер tmrTimer (интервал ~25-50)
'2) RTB RichTextBox1

'Все события происходят по таймеру...
'Если в момент "тика" нажата левая кнопка мыши и окно, на которое
'направлен курсор имеет класс окна RichTextBox, то текст из этого
'окна должен скопироваться в ваш RichTextBox1.
'На практике есть одна проблема: (см. по тексту)


'API DECLARATIONS
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

'Type for window identification
Private Type POINTAPI
X As Long
Y As Long
End Type

'Constant for left mouse button
Private Const VK_LBUTTON = &H1

'Maximum sizes of window text & class name
Private Const MAX_TEXT_SIZE = 1024
Private Const MAX_CLASS_NAME_SIZE = 32

'Used variables
Private cPos As POINTAPI
Private wHwnd As Long
Private wTextLen As Long
Private wClassLen As Long
Private wText As String * MAX_TEXT_SIZE
Private wClass As String * MAX_CLASS_NAME_SIZE

'Строка с необходимым классом
Private wNeedClass As String * MAX_CLASS_NAME_SIZE

'Временная переменная
Private Data As String

Private Sub Form_Load()
'Заполнение пробелами
wText = Space(MAX_TEXT_SIZE)
wClass = Space(MAX_CLASS_NAME_SIZE)
wNeedClass = Space(MAX_CLASS_NAME_SIZE)

'Имя класса окна RTB
wNeedClass = "RichTextWndClass"
End Sub

Private Sub tmrTimer_Timer()
'Если не нажата мышь, то выходим...
If GetAsyncKeyState(VK_LBUTTON) >= 0 Then Exit Sub

'Ищем hwnd текущего окна под курсором...
GetCursorPos cPos
wHwnd = WindowFromPoint(cPos.X, cPos.Y)

'Ищем класс окна под курсором...
GetClassName wHwnd, wClass, MAX_CLASS_NAME_SIZE

'Ищем длину текста окна...
wTextLen = GetWindowTextLength(wHwnd)

'Ошибка в этой строке: одинаковые строки не равны (???)
If Trim$(wClass) = Trim$(wNeedClass) Then
GetWindowText wHwnd, wText, MAX_TEXT_SIZE
wText = Trim$(wText)
If MsgBox("Переместить текст из этого элемента в RichTextBox1?", vbYesNo) = vbYes Then
Data = Trim$(wText)
RichTextBox1.Text = Data
End If
End If
End Sub

'Вот и всё, в общем-то... Если не проверять классы, а тыкать точно в окно, то всё ОК, но что-то у меня в коде. наверное, неверно... Вроде, если выводить имена классов через messagebox, то всё одинаково... Я ничего пока не понял :)
А так, пример вполне работоспособен. Скопируйте этот текст программы в одно окно VB, создайте ещё один проект с RTB, введите туда что-нибудь и попробуйте хакнуть... У меня при отключении проверки имён классов всё работало. Удачи! :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 15.03.2003 (Сб) 6:38

'Вот то я нашёл:
'Этот код получает текст из другого TextBox по SendMessage
'IMHO его надо лишь немного изменить...
'Вам необходимо разместить на форме элемент Timer.

--------------------------------------------------------------------------------
'to get the foreground window
Private Declare Function GetForegroundWindow Lib "user32" () As Long
'to send a message system
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
'to get the cursor position
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
'to get the window from a point (y,x)
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
'to get the window text
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
'to get the class name (edit,combobox etc..)
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public strBuffer As String ' the string to append to the file that has all the text "grabed"
Public iEnum As Integer ' the file integer to open and write (I/O)
Public hJanelaCima As Long ' the window wich the user has the mouse over
Public hJanelaAntiga As Long ' the ancient window, to controlo if thereґs a new window or not
'constants to grab the text
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
'type for the GetCursorPos API
Private Type POINTAPI
x As Long
y As Long
End Type

Private Sub Form_Load()
'when starting the program, print date and time of the new logging...
strBuffer = "=============================================================" & vbCrLf
strBuffer = strBuffer & "Date of log: " & Format(Date, "YYYY-MM-DD") & vbCrLf
strBuffer = strBuffer & "Started logging at: " & Format(Time$, "HH:MM") & vbCrLf
strBuffer = strBuffer & "=============================================================" & vbCrLf
iEnum = FreeFile
'append it in the file
Open "C:\testes.txt" For Append As #iEnum
Print #iEnum, strBuffer
Close #iEnum
strBuffer = ""
'enable the timer...
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim ptCursor As POINTAPI ' the cursor type variable
Dim texto_janela As String ' the window text
Dim rc As Long
Dim nome_classe As String ' the class name
Dim fenster As Long ' the foreground window.. in deutsh.. ich wisse deutshe auch...
fenster = GetForegroundWindow ' get the window where user is
'create string objects
texto_janela = String(100, Chr(0))
nome_classe = String(100, Chr(0))
Call GetCursorPos(ptCursor) ' get the cursor position
'get the window(handle) where the user has the mouse
hJanelaCima = WindowFromPoint(ptCursor.x, ptCursor.y)
'get the window text and class name
rc = GetWindowText(fenster, texto_janela, Len(texto_janela))
rc = GetClassName(hJanelaCima, nome_classe, 100)
'format the assholes...
texto_janela = Left(texto_janela, InStr(texto_janela, Chr(0)) - 1)
nome_classe = Left(nome_classe, InStr(nome_classe, Chr(0)) - 1)
Debug.Print nome_classe
' check the class names... i tried some like WinWord and VB, but didnґt worked..

'If nome_classe = "Edit" Or nome_classe = "_WwG" Or nome_classe = "Internet Explorer_Server" Or nome_classe = "RichEdit20A" Or nome_classe = "VbaWindow" Then
'if this is the same window, forget
If hJanelaCima = hJanelaAntiga Then Exit Sub
'thereґs no text? Out!
If WindowText(hJanelaCima) = Empty Then Exit Sub
'put the ancient window handle, with the current one
hJanelaAntiga = hJanelaCima
'build string with time and the text grabed with WindowText
strBuffer = Time$ & " - " & texto_janela & vbCrLf
strBuffer = strBuffer & WindowText(hJanelaCima) & vbCrLf
'append to the file
Open "C:\testes.txt" For Append As #iEnum
Print #iEnum, strBuffer
Close #iEnum

'End If
End Sub

'grab the text window with this function.. argument- the window handle
Public Function WindowText(window_hwnd As Long) As String
Dim txtlen As Long
Dim txt As String
If window_hwnd = 0 Then Exit Function
'send the message to get the text lenght
txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
If txtlen = 0 Then Exit Function
txtlen = txtlen + 1
txt = Space$(txtlen)
'send the message to get the text
txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt)
'put that on the function
WindowText = Left$(txt, txtlen)
End Function

=======================
P.S. Код программы взят с VBNet.ru


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList  
cron