M.T.Danoj Ответов: 1

Пожалуйста, помогите мне получить имя класса окна, текстовых полей, командных кнопок или . . . . .


Дорогие все,

Я все еще новичок в этом деле. vb.net и хотите получить обработчик и имя класса окна, текстового поля или командной кнопки, когда мышь находится там. Я попробовал ниже код получил обработчик в textbox1 и ничего не попадает в textbox2 как имя класса. Ниже программа внезапно перестает работать.
помогите мне получить имя класса с помощью функции GetClassname API или каким-то другим способом

Что я уже пробовал:

Система Импорта.Во время выполнения.InteropServices
Система Импорта.Строка
Система Импорта.Текст



Общественного Класса Form1

Общественные объявить функцию, то getclassname Либ "user32.dll" псевдоним "GetClassNameA" (как byval hwnd и как int32, как byval lpClassName, как струна, nMaxCount бывал как int32) как int32

Общественные объявить функцию WindowFromPoint Либ "user32.dll" ("икспоинт" бывал как int32, yPoint бывал как int32) как int32

Общественные объявить функцию SetForegroundWindow Либ "user32.dll" (как byval hwnd и как int32) как int32



Private Sub Timer1_Tick(sender As Object, e As EventArgs) обрабатывает Timer1.Tick

SetForegroundWindow(MyBase.Ручка)
Dim ParentHandler As IntPtr = WindowFromPoint(MousePosition.Х, MousePosition.Г)
Текстовое поле textbox1.Текст = ParentHandler.Метод toString



Dim sClassName как новый StringBuilder("", 256)
GetClassName(ParentHandler, sClassName.ToString, 256)
Поле textbox2.Текст = sClassName.Метод toString()

Конец Подводной Лодки

1 Ответов

Рейтинг:
1

OriginalGriff

Вы создаете StringBuilder для хранения результата, но затем вы не используете его для разговора с GetClassName - вы сначала преобразуете его в строку и передаете ее:

Dim sClassName As New StringBuilder("", 256)
GetClassName(ParentHandler, sClassName.ToString, 256)
Поскольку вы не добавили никаких данных в StringBuilder, вызов ToString вернет пустую строку, поэтому будет иметь нулевую длину, а поскольку строки в .NET неизменяемы, GetClassName не может изменить ее, даже если вы передали фактические данные ...
Вместо этого передайте StringBuilder напрямую:
Dim sClassName As New StringBuilder("", 256)
GetClassName(ParentHandler, sClassName, 256)


M.T.Danoj

Дорогой OriginalGriff и все такое

когда я пытаюсь ниже кода, sClassname (в функции API GetClassname) подчеркивается красным цветом получает сообщение об ошибке meesage
как "значение типа stringBuilder не может быть преобразовано в строку"

Помогите & Пожалуйста, объясните подробнее


Dim sClassName как новый StringBuilder("", 256)
GetClassName(ParentHandler, sClassName, 256)

OriginalGriff

Чего ты не понимаешь?
Вы не можете передать строку в GetClassName, он ожидает указатель на строку, чтобы заполнить ее. Это StringBuilder, потому что строки неизменяемы - они не могут быть изменены после создания.

Итак, в чем, по-вашему, заключается ваша ошибка?