Страница: 1 |
Страница: 1 |
Вопрос: Это ИНТЕРЕСНО. Определение имени контрола.
Добавлено: 21.03.05 20:09
Автор вопроса: mistershem | Web-сайт:
HELP,HELP,HELP,HELP,HELP
______________________________________________________
Определяем hWnd окна и затем перебором коллекции определяем имя контрола (если надо код, то предоставлю). Но ЗАПУТКА вот в чем. Если на форме есть элементы НЕ ОКНА,например CommonDialog, ADODC , то имена нормальных окон, например Command, Text не определяются. КАК ИСПРАВИТЬ ЭТУ ФИГНЮ.
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #1
Добавлено: 21.03.05 21:11
Код в студию! У тебя там явно что-то криво написано: сколько раз делал определение контрола по хэндлу - никогда проблем не было. Наверняка неверно отрабатываешь ситуацию с контролами, не имеющими свойства hWnd...
Номер ответа: 2
Автор ответа:
mistershem
Вопросов: 8
Ответов: 16
Web-сайт:
Профиль | | #2
Добавлено: 21.03.05 22:08
Каюсь..Но продублировал случайно. Хотел переименовать название, а инет тупит. Вот и думал, что не отошел ешо пакет, нажал на СТОП и послал заново.
________________________________________________________
RE:Наверняка неверно отрабатываешь ситуацию с контролами, не имеющими свойства hWnd... (Дык я ее ваще не обрабатываю. А как надо-то обрыботать ???)
Код такой:
Dim handHwnd As Long
'------------Это вот функция
Public Function GetControlNameFromWindow(ByVal hwnd&
 im formnum%
 im ctlnum%
For formnum% = 0 To Forms.Count - 1
If Forms(formnum.hwnd = hwnd& Then
GetControlNameFromWindow = Forms(formnum.Name
Exit Function
End If
For ctlnum% = 0 To Forms(formnum.Controls.Count - 1
On Error Resume Next
If Forms(formnum.Controls(ctlnum.hwnd = hwnd& Then
If Err.Number = 0 Then
GetControlNameFromWindow = Forms(formnum.Controls(ctlnum.Name
End If
Exit Function
End If
Next ctlnum%
Next formnum%
End Function
'--------------Вот это определение hWnd
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim dl
Dim mousepos As POINTAPI ' координаты курсора мыши
Dim retval As Long ' возвращаемое значение
PointMode% = -1
dl = SetCapture(me.hwnd)
' Определяем окно под курсором
retval = GetCursorPos(mousepos) ' получаем координаты курсора
handWnd = WindowFromPoint(mousepos.X, mousepos.Y) ' определяем окно под курсором
If handWnd = 0 Then ' ошибка или нет окна в этой точке
 ebug.Print "Здесь ничего нет."
End
End If
End Sub
'---------А вот это показывает имя
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
CtrlName = GetControlNameFromWindow(handWnd)
MsgBox CtrlName
PointMode% = 0
SetFocusAPI (handWnd)
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
If GetCapture() = me.hwnd Then ReleaseCapture
End Sub
А дальше не могу. Ступор и все.
Номер ответа: 3
Автор ответа:
mistershem
Вопросов: 8
Ответов: 16
Web-сайт:
Профиль | | #3
Добавлено: 27.03.05 13:01
Вот теперь нормально работает.
Вот код модуля (module1):
Type POINTAPI
X As Long
Y As Long
End Type
Declare Function WindowFromPoint Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
'----------Определяем имя контроля
Public Function GetControlNameFromWindow(ByVal hwnd&
 im formnum%
 im ctlnum%
For formnum% = 0 To Forms.Count - 1
If Forms(formnum.hwnd = hwnd& Then
GetControlNameFromWindow = Forms(formnum.Name
Exit Function
End If
For ctlnum% = 0 To Forms(formnum.Controls.Count - 1
On Error Resume Next
If Forms(formnum.Controls(ctlnum.hwnd = hwnd& Then
If Err.Number = 0 Then
GetControlNameFromWindow = Forms(formnum.Controls(ctlnum.Name
Else
GoTo Next_Ctrl
End If
' If Forms(formnum.Controls(ctlnum.hwnd = -1 Then
' MsgBox "буба"
' ctlnum% = ctlnum% + 1
' GetControlNameFromWindow = Forms(formnum.Controls(ctlnum.Name
' End If
Exit Function
End If
Next_Ctrl: Next ctlnum%
Next formnum%
End Function
Вот код Form1:
Пишем на стартовой форме:
Dim mousepos As POINTAPI ' координаты курсора мыши
Dim wintext As String, slength As Long ' текст заголовков окна и его длина
Dim handWnd As Long ' дескриптор окна,находящегося в точке
Dim retval As Long ' возвращаемое значение
'Ставим Timer на стартовую форму и пишем в нем:
Private Sub Timer1_Timer()
retval = GetCursorPos(mousepos) ' получаем координаты курсора
handWnd = WindowFromPoint(mousepos.X, mousepos.Y) ' определяем окно под курсором
If handWnd = 0 Then ' ошибка или нет окна в этой точке
 ebug.Print "Здесь ничего нет."
End
Else
ctrlname = GetControlNameFromWindow(handWnd)
 ebug.Print "hWnd: " & handWnd & " ; Имя: " & ctrlname & " ; X=" & mousepos.X & " Y=" & mousepos.Y
End If
End Sub