SendMessage и строковый параметр

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

SendMessage и строковый параметр

Сообщение Naked » 06.04.2006 (Чт) 7:40

отправляю окну Call SendMessage(hwnd, 666, 0, ByVal "hello")

Код: Выделить всё
Function WindowProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case message
      case 666
         lparam - выводит цифры
         WindowProc = CallWindowProc(mWndProcOrg, hwnd, message, wParam, lParam)

      case else
         WindowProc = CallWindowProc(mWndProcOrg, hwnd, message, wParam, lParam)
   end select
end function


как мне получить этот самый "hello", в обработчике событий?

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

Сообщение GSerg » 06.04.2006 (Чт) 8:06

buf=string$(lstrlen(lparam),0)
copymemory byval buf, byval lparam, len(buf)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.04.2006 (Чт) 8:53

GSerg писал(а):buf=string$(lstrlen(lparam),0)
copymemory byval buf, byval lparam, len(buf)

Либо вместо этих двух строк -- одну:
Код: Выделить всё
buf = SysAllocString(lParam)
Изображение

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

Сообщение GSerg » 06.04.2006 (Чт) 9:02

А точно lparam будет указывать на юникодовую строку?

Parameter
    sz
      A zero-terminated string to copy. The sz parameter must be a Unicode string in 32-bit applications, and an ANSI string in 16-bit applications. The argument sz may be NULL.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.04.2006 (Чт) 9:05

Какая разница? Лишь бы \0 в конце был двухбайтным.
Изображение

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

Сообщение GSerg » 06.04.2006 (Чт) 9:06

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.04.2006 (Чт) 9:08

Для любителей однобайтных кодировок есть SysAllocStringByteLen, имеющая то преимущество перед твоим кодом, что не нужно сначала забивать строку мусором (=работает быстрее).
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 06.04.2006 (Чт) 9:40

Благодарю

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 25.04.2006 (Вт) 7:20

с этим вы мне помогли за что и благодарю вас, но возник исчо один вопрос

посылаем сообщение Call SendMessage(hwnd, 777, param1, param2)
как получить значения param1 и param2

примером послужит Call SendMessage(hwnd, WM_GETTEXT, param1, param2)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2006 (Вт) 7:40

что значит "получить"? они сами тебе в оконную процедуру приходят.
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 25.04.2006 (Вт) 8:14

ну допустим отправил я окну Call SendMessage(hwnd, 666, Len("hello"), ByVal "hello")

Код: Выделить всё
Dim Perem

Function WindowProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case message
      case 666
         Dim buf As String
         buf = String$(wParam, 0)
         Call CopyMemory(ByVal buf, ByVal lParam, wParam)
         Perem = buf 'запомнили в переменной "hello"
         WindowProc = CallWindowProc(mWndProcOrg, hwnd, message, wParam, lParam)
 
      case 777
         чего тут писать

         WindowProc = CallWindowProc(mWndProcOrg, hwnd, message, wParam, lParam)

      case else
         WindowProc = CallWindowProc(mWndProcOrg, hwnd, message, wParam, lParam)
   end select
end function


а теперь, каким образом выдрать это самое "hello" отправляя окну Call SendMessage(hwnd, 777, длина строки, строка)
msgbox строка

или я чего-то не догоняю

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2006 (Вт) 10:36

Видимо, не догоняешь.
Выше я уже писал о SysAllocStringByteLen.
Чем она не подошла-то?
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 25.04.2006 (Вт) 11:27

tyomitch примером не поможешь?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2006 (Вт) 11:35

вместо
Код: Выделить всё
         Dim buf As String
         buf = String$(wParam, 0)
         Call CopyMemory(ByVal buf, ByVal lParam, wParam)
         Perem = buf 'запомнили в переменной "hello"


--одна строчка:
Код: Выделить всё
         Perem = SysAllocStringByteLen(ByVal lParam, wParam)
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 25.04.2006 (Вт) 13:23

я предполагал, что ты так напишешь
это не то, что я хотел.

нужен такой принцип работы

Код: Выделить всё
Const WM_SETTEXT = &HC
Const WM_GETTEXT = &HD
Const WM_GETTEXTLENGTH = &HE

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
Dim nText As String
Dim nLen As Long

Private Sub Command1_Click()
    SendMessage hwnd, WM_SETTEXT, 0, ByVal "hello"
End Sub

Private Sub Command2_Click()
    nLen = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)
    nText = String(nLen + 1, Chr$(0))
    SendMessage hwnd, WM_GETTEXT, nLen + 1, ByVal nText
    MsgBox nText 'получили hello
End Sub


а в моем случае нужно
Код: Выделить всё
Private Sub Command1_Click()
    Call SendMessage(hwnd, 666, Len("hello"), ByVal "hello")
End Sub

Private Sub Command2_Click()
    nlen = 5
    SendMessage hwnd, 777, nlen, ByVal nText
    MsgBox nText 'как мне получить hello ?
End Sub


надеюсь теперь понятно объяснил :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2006 (Вт) 17:45

теперь понятнее.
Код: Выделить всё
CopyMemory ByVal lParam, ByVal "Hello", wParam
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 26.04.2006 (Ср) 2:04

tyomitch спасибо


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

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

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 179

    TopList  
cron