powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / winapi SendMessage LB_GETTEXT возвращает только 8 символов
25 сообщений из 33, страница 1 из 2
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38691731
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Такая проблема. Пытаюсь из ListBox вытащить значение.
Dim V$ = Space(99)
MsgBox(SendMessage(wnd, LB_GETTEXT, 15, V))
MsgBox("$" + V + "$")

2-е окно выдает $ + 8 символов + непонятный символ. Замыкающего $ нет. Сама SendMessage возвращает почему-то 8, вместо 9 и более, если другие числа подставлять.

В чем может быть проблема?
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38692147
GustlyDim V$ = Space(99)0) Это по-каковски?

1) Любой вопрос по API, в котором не приведено описание API (Declare), можно сразу отправлять в топку. Потому, что иначе гадание и потеря времени. Вангую описание lParam без ByVal.

2) Лучше приложить к сообщению минимальный проект, на котором наблюдается эдефект.

3) Замыкающего "$" MsgBox не выдаёт из-за того, что в строке есть символ с кодом 0, считающийся окончанием строки. Багофича.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38692176
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й квартал,

Спасибо что ответили.

0) Это по-каковски?
Win7 x64, visual studio express 2012, visual basic project

1) Любой вопрос по API, в котором не приведено описание API (Declare), можно сразу отправлять в топку. Потому, что иначе гадание и потеря времени. Вангую описание lParam без ByVal.
Код в спойлере

2) Лучше приложить к сообщению минимальный проект, на котором наблюдается эдефект.
Код в спойлере

3) Замыкающего "$" MsgBox не выдаёт из-за того, что в строке есть символ с кодом 0, считающийся окончанием строки. Багофича.
Увы. Дефект словил только в целевой проге. Если я в хэндл передаю ListBox из моего окошка, вроде как строку полностью возвращает.
Например я вижу слово "Functions" возвращает "Function" а LB_GETTEXTLEN = 46
"frame_templates" возвращает "frame_te" а LB_GETTEXTLEN = 58.
При этом сама LB_GETTEXT всегда возвращает 8, если я объявлял SendMessageA и 4 если SendMessageW


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
Public Class Form1
    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, ByVal lParam As String) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Long

    Public Declare Function SendMessageCallback Lib "user32" Alias "SendMessageCallbackA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As String, ByVal lpResultCallBack As Long, ByVal dwData As Long) As Long
    Private Const WM_CHAR = &H102
    Private Const WM_SETTEXT = &HC
    Private Const WM_GETTEXT = &HD
    Private Const VK_RETURN = &HD
    Private Const LB_ADDSTRING = &H180
    Private Const LB_INSERTSTRING = &H181
    Private Const LB_DELETESTRING = &H182
    Private Const LB_SELITEMRANGEEX = &H183
    Private Const LB_RESETCONTENT = &H184
    Private Const LB_SETSEL = &H185
    Private Const LB_SETCURSEL = &H186
    Private Const LB_GETSEL = &H187
    Private Const LB_GETCURSEL = &H188
    Private Const LB_GETTEXT = &H189
    Private Const LB_GETTEXTLEN = &H18A
    Private Const LB_GETCOUNT = &H18B
    Private Const LB_SELECTSTRING = &H18C
    Private Const LB_DIR = &H18D
    Private Const LB_GETTOPINDEX = &H18E
    Private Const LB_FINDSTRING = &H18F
    Private Const LB_GETSELCOUNT = &H190
    Private Const LB_GETSELITEMS = &H191
    Private Const LB_SETTABSTOPS = &H192
    Private Const LB_GETHORIZONTALEXTENT = &H193
    Private Const LB_SETHORIZONTALEXTENT = &H194
    Private Const LB_SETCOLUMNWIDTH = &H195
    Private Const LB_ADDFILE = &H196
    Private Const LB_SETTOPINDEX = &H197
    Private Const LB_GETITEMRECT = &H198
    Private Const LB_GETITEMDATA = &H199
    Private Const LB_SETITEMDATA = &H19A
    Private Const LB_SELITEMRANGE = &H19B
    Private Const LB_SETANCHORINDEX = &H19C
    Private Const LB_GETANCHORINDEX = &H19D
    Private Const LB_SETCARETINDEX = &H19E
    Private Const LB_GETCARETINDEX = &H19F
    Private Const LB_SETITEMHEIGHT = &H1A0
    Private Const LB_GETITEMHEIGHT = &H1A1
    Private Const LB_FINDSTRINGEXACT = &H1A2
    Private Const LB_SETLOCALE = &H1A5
    Private Const LB_GETLOCALE = &H1A6
    Private Const LB_SETCOUNT = &H1A7
    Private Const CB_GETLBTEXT = &H148

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Text = "asd"
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim hwnd As Long, wnd As Long, wnd2 As Long, st As String

        'Me.TextBox1.Text =
        FindForm().Text = "zxc"
        st = Space(99)
        Dim V$ = Space(16)
        MsgBox("$" + st + "$")
        hwnd = FindWindow(vbNullString, "Прога")
        MsgBox(hwnd.ToString)
        GetClassName(529602, st, 10)
        'wnd = FindWindowEx(hwnd, 0&, "Afx:00400000:8:00000000:011000A8:00000000", vbNullString) 'получаем hwnd текстбокса блокнота
        wnd = FindWindowEx(hwnd, 0&, vbNullString, vbNullString) 'получаем hwnd текстбокса блокнота
        'MsgBox(wnd.ToString)
        'wnd2 = FindWindowEx(wnd, 0, "Afx:00400000:0:00010005:00000000:00000000", vbNullString) 'получаем hwnd текстбокса блокнота
        wnd2 = FindWindowEx(wnd, 0, vbNullString, vbNullString) 'получаем hwnd текстбокса блокнота
        'MsgBox(wnd.ToString)
        'wnd2 = FindWindowEx(wnd, wnd2, "Afx:00400000:0:00010005:00000000:00000000", vbNullString) 'получаем hwnd текстбокса блокнота
        wnd2 = FindWindowEx(wnd, wnd2, vbNullString, vbNullString) 'получаем hwnd текстбокса блокнота
        'MsgBox(wnd.ToString)
        'wnd = FindWindowEx(wnd, wnd2, "Afx:00400000:0:00010005:00000000:00000000", vbNullString) 'получаем hwnd текстбокса блокнота
        wnd = FindWindowEx(wnd, wnd2, vbNullString, vbNullString) 'получаем hwnd текстбокса блокнота
        'MsgBox(wnd.ToString)
        'wnd = FindWindowEx(wnd, 0&, "AfxFrameOrView70", vbNullString) 'получаем hwnd текстбокса блокнота
        wnd = FindWindowEx(wnd, 0&, vbNullString, vbNullString) 'получаем hwnd текстбокса блокнота
        'MsgBox(wnd.ToString)
        'wnd = FindWindowEx(wnd, 0&, "ListBox", vbNullString) 'получаем hwnd текстбокса блокнота
        wnd = FindWindowEx(wnd, 0&, vbNullString, vbNullString) 'получаем hwnd текстбокса блокнота
        'MsgBox(wnd.ToString)
        'wnd = 529602
        Call GetClassName(wnd, st, 99)
        'TextBox1.Text = st
        'Call SendMessage(wnd, WM_SETTEXT, 0, "Test2")
        'MsgBox(LB_FINDSTRING)
        'MsgBox(SendMessage(TextBox1.Text, LB_GETTEXT, 1, V))
        MsgBox("Len13=" + CStr(SendMessage(wnd, LB_GETTEXTLEN, 13, 0)))
        MsgBox("Len14=" + CStr(SendMessage(wnd, LB_GETTEXTLEN, 14, 0)))
        MsgBox("Len15=" + CStr(SendMessage(wnd, LB_GETTEXTLEN, 15, 0)))
        MsgBox(SendMessage(wnd, LB_GETTEXT, 13, V))
        'MsgBox(SendMessageCallback(463934, LB_GETTEXT, 1, V, 0, 0))
        'MsgBox(SendMessage(wnd, LB_SELECTSTRING, 0, "DRM"))
        MsgBox(Len(V))
        RichTextBox1.Text = V
        MsgBox("$" + V + "$")
        'Call SendMessage(wnd, EM_SETSEL, 6, "") 'сдвигаем курсор на 6 знаков
        'Call SendMessage(wnd, WM_CHAR, VK_RETURN, vbNullString) 'нажимаем Enter
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged

    End Sub
End Class



Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38740787
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к теме. Может ли это быть из-за того, что целевое приложение очень старое и 32-битное, а я пишу в х64 винде. Можно ли как-то подключить user32.dll с sendmessage например от windows XP или 98 ?
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741004
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, нет дело не в разрядности винды. Нет не надо даже пытаться заменить user32 более старой версией. Что нужно так это переписать код посылки LB_GETTEXT:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW"(ByVal hWnd As IntPtr, ByVal msg As UInteger, _
	ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW"(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
   ByVal wParam As IntPtr, ByRef lParam As StringBuilder) As IntPtr

Const LB_GETTEXT    As UInteger = &h0189
Const LB_GETTEXTLEN As UInteger = &h018A
Dim Shared Readonly LB_ERR As New IntPtr(-1)

Private Shared Function GetListBoxItemText(hwndListBox As IntPtr, itemIdx As Integer) As String
	Dim textLen As IntPtr = SendMessage(hwndListBox, LB_GETTEXTLEN, itemIdx, IntPtr.Zero)
	If textLen = LB_ERR Then Return ""
	
	Dim sb As New StringBuilder(textLen.ToInt32() + 1)
	SendMessage(hwndListBox, LB_GETTEXT, itemIdx, sb)
	Return sb.ToString()
End Function


Важным является использование StringBuilder в качестве четвертого аргумента.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741487
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

Спасибо за код, но

Код: vbnet
1.
2.
3.
4.
Dim hwndListBox As IntPtr = 12662938
Dim textLen As IntPtr = SendMessage(hwndListBox, LB_GETTEXTLEN, 4, IntPtr.Zero)
Dim sb As New StringBuilder(textLen.ToInt32() + 1)
'SendMessage(hwndListBox, LB_GETTEXT, 1, sb)


4-я строка вызывает
An unhandled exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

При этом textLen всегда 8 символов, независимо от 3-го параметра (wParam The zero-based index of the string. )
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741494
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly,
Не могу понять что Вы добиваетесь. Если передать текстовую строку через меседж, имхо вектор рассуждений не пральный, есть общепринятые решения для этого дела, Пож?
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741577
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, почему ты получаешь длину для элемента 4, а потом просишь текст элемента 1? Или все элементы имеют одинаковую длину?
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741605
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Конечная цель - поиск по listbox в стороннем приложение. Но сейчас банально не могу получить правильное значение выбранного элемента. Если я указываю handle от listbox в моем приложение, то через win api все нормально возвращается, если же handle от целевого listbox, то не более 8 символов.

bazile

Код закомментарен, поэтому там 1, а вообще я разные индексы пробовал, везде одна и та же ошибка.

Вообще если сделать объявление не SendMessageW, а SendMessageA , то возвращаемая длина становится разной, но все равно непонятной.

У "!TEST.SQS" - возвращает 27, У "!TEST23.SQS" возвращает 29
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741611
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас вот поменял в объявление функции

ByRef lParam As StringBuilder

на

ByVal lParam As StringBuilder

Ошибка исчезла, но возвращается беда.

!TEST23.°2BЂъяя
!TEST23.xъЅД
!TEST23.°2BЂъяя
!TEST23.xъЅД
!TEST23.xъЅД
!TEST23.xъЅД
!TEST23.°2BЂъяя
!TEST23.xъЅД
!TEST23.xъЅД
!TEST23.xъЅД
!TEST23.°2BЂъяя


Вместо "!TEST23.SQS"

То есть вернул 8 символов + непонятно что
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741923
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подозреваю, что память под строку надо выделить с помощью
Код: c#
1.
System.Runtime.InteropServices.Marshal.AllocHGlobal



потом удалить через System.Runtime.InteropServices.Marshal.FreeHGlobal
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38741938
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал, ошибки нет, но все равно 4 символа + кракозябры.

Есть еще способы получить значение listbox в чужом приложение?

Все таки попробовал подключить user32.dll от winXP x86 , Visual Studio вылетела с ошибкой при попытки добавить в проект dll.

Других причин не вижу, почему из моего же EXEшника нормально вытаскиваются значения, а из этого динозавра только 4 или 8 символов.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38742017
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, попробуй в моем примера подставить такую сигнатуру SendMessage:
Код: vbnet
1.
2.
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW"(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
   ByVal wParam As IntPtr, <MarshalAs(UnmanagedType.LPWStr)>ByVal lParam As StringBuilder) As IntPtr


Я его проверил на своей машине и он сработал.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38742037
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

len=8
吡卅쩬_༄


1-я строка это результат
SendMessage(ControlHandle, LB_GETTEXTLEN, 1, 0)

2-я строка это 4-й параметр от
SendMessage(ControlHandle, LB_GETTEXT, 1, sb)
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38742062
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, попробуй UnmanagedType.LPStr и UnmanagedType.LPTStr. Также можно попробовать ANSI версию SendMessage, то есть SendMessageA.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38742573
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

С ANSI версией длина 28 (реальная длина + 18).
С UnmanagedType.LPTStr помимо китайского начал еще и шрифт искажаться
С UnmanagedType.LPStr получаю:
len=28
!TESьа€Hб€
len=28
!TES
len=28
!TES
len=28
!TES
len=28
!TES

В инете видел упоминание программы, "текст граблер" (дословно), но такую не нашел, она якобы могла любой выбранный селект лист записать в тестовый файл. Кто-нибудь слышал?
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743331
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз пока других идей нет. Подскажите пожалуйста как правильно подцепить sendmessage из других dll ? Даже когда пытаюсь добавить родной user32.dll ругается что не может, мол dll неправильный, если же пытаюсь добавить от winXP то вылетает студия с ошибкой.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743677
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, давай попробуем проверить что будет если исключить .NET-ий маршаллинг. Выделяем память вручную и вручную же преобразовываем байты в строку. Главное посмотри что у тебя в переменной buffer перед возвратом из функции. Все ли символы на месте.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW"(ByVal hWnd As IntPtr, ByVal msg As UInteger, _
	ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

Const LB_GETTEXT    As UInteger = &h0189
Const LB_GETTEXTLEN As UInteger = &h018A
Dim Shared Readonly LB_ERR As New IntPtr(-1)

Private Shared Function GetListBoxItemText(hwndListBox As IntPtr, itemIdx As Integer) As String
	Dim hBuffer As IntPtr = IntPtr.Zero
	Try
		Dim textLen As IntPtr = SendMessage(hwndListBox, LB_GETTEXTLEN, itemIdx, IntPtr.Zero)
		If textLen = LB_ERR Then Return ""
		
		Dim bufLen As Integer = textLen.ToInt32()*2 + 1
		hBuffer = Marshal.AllocHGlobal(bufLen)
		SendMessage(hwndListBox, LB_GETTEXT, itemIdx, hBuffer)
		
		Dim buffer(bufLen-1) As Byte
		Marshal.Copy(hBuffer, buffer, 0, buffer.Length)
		
		' Ставим breakpoint здесь и смотрим содержимое buffer
		Return Encoding.Unicode.GetString(buffer, 0, buffer.Length-1)
	Finally
		If hBuffer <> IntPtr.Zero
			Marshal.FreeHGlobal(hBuffer)
		End If
	End Try
End Function



GustlyДаже когда пытаюсь добавить родной user32.dll ругается что не может, мол dll неправильный
Если ты пытаешься добавить reference на user32, то это бесполезно т.к. reference делаются только на управляемые сборки, которой user32.dll не является.

Вообще же идея с подменой user32 на старую версию мне кажется тупиковой. Врядли дело в SendMessage и, главное, непонятно как поведет себя приложение если в нее загрузить две разных версии user32 - если Windows это вообще позволит.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743680
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще один вариант с Ansi версией SendMessage:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA"(ByVal hWnd As IntPtr, ByVal msg As UInteger, _
	ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

Const LB_GETTEXT    As UInteger = &h0189
Const LB_GETTEXTLEN As UInteger = &h018A
Dim Shared Readonly LB_ERR As New IntPtr(-1)

Private Shared Function GetListBoxItemText(hwndListBox As IntPtr, itemIdx As Integer) As String
	Dim hBuffer As IntPtr = IntPtr.Zero
	Try
		Dim textLen As IntPtr = SendMessage(hwndListBox, LB_GETTEXTLEN, itemIdx, IntPtr.Zero)
		If textLen = LB_ERR Then Return ""
		
		Dim bufLen As Integer = textLen.ToInt32() + 1
		hBuffer = Marshal.AllocHGlobal(bufLen)
		SendMessage(hwndListBox, LB_GETTEXT, itemIdx, hBuffer)
		
		Dim buffer(bufLen-1) As Byte
		Marshal.Copy(hBuffer, buffer, 0, buffer.Length)
		Console.WriteLine(buffer)
		
		' Ставим breakpoint здесь и смотрим содержимое buffer
		Return Encoding.Default.GetString(buffer, 0, buffer.Length-1)
	Finally
		If hBuffer <> IntPtr.Zero
			Marshal.FreeHGlobal(hBuffer)
		End If
	End Try
End Function

...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743819
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

Длина буфера 29. Функция возвращает первые 4 симола + 1 случайный символ, иногда цыфра 9 иногда буква m. Судя по winspector и предыдущим экспериментам лучше пользоваться только ANSI версией.

Еще заметил, если запускать итоговый EXE с совместимостью XP например или Win 2000, то краказябр после 4 символов нет, всегда 4 символа и всегда родные.

Попробовал другую прогу, тот же winspector которым я хэндлы ищу, из его listbox вернулась строка с 50+ символов, где она в приложение именно не увидел, но вернулась она полная. Возможно ли что в целевом приложение listbox какой-то не такой?

Вот внешний вид. Может натолкнет на мысль.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743832
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, на скриншоте List View, а не List Box. Попробуй получить его текст с помощью сообщения LVM_GETITEMTEXT .
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743840
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

SendMessage(ControlHandle, LVM_GETITEMTEXT, 10, h)

Возвращает 1 случайный символ

Вот свойства объекта
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743922
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gustly, это все-таки List Box, но он owner-draw. Возможно в этом корень проблемы. Может в реализации ListBox баг какой-то. Надо изучать память этого процесса и чтобы понять как вытащить эти строки. Можно также попытаться получать не текст, а данные связанные с ним через LB_GETITEMDATA. И посмотреть что находится в этом участке памяти.
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743924
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

У меня еще проблема, мне каждый раз приходится искать в интернете объявления этих констант (LB_GETITEMDATA). Что надо прописать чтобы они подцепились нормально?
...
Рейтинг: 0 / 0
winapi SendMessage LB_GETTEXT возвращает только 8 символов
    #38743943
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GustlyЧто надо прописать чтобы они подцепились нормально?создай отдельный класс с константами.

в c++ это дефайны (макросы), потому из dll их не достать.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / winapi SendMessage LB_GETTEXT возвращает только 8 символов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]