Работа с меню програмно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Работа с меню програмно

Сообщение xenomorph » 30.12.2004 (Чт) 22:08

Вопрос:

Как работать с меню програмно?
- т.е. через АПИ + программа внешняя - я в гипертерминале хочу выделить текст и скопировать -
единственный божеский вариант -
выделить меню "Выделить всё", "Копировать".

Если можно - скажу огромное спасибо за кусочек кода \ линк!
--
Огромное спасибо заранее!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 30.12.2004 (Чт) 22:28

Гм. на вопрос не отвечу, но вот один момент:
xenomorph писал(а):Как работать с меню програмно?

А что, можно еще аппаратно? Следует писать из кода :lol:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Amed » 30.12.2004 (Чт) 22:34

а) ищем главное окно Гипертерминала
б) ищем собственно окно терминала
в) шлём WM_COPY или WM_COPYDATA

Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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
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 Const WM_COPYDATA = &H4A
Private Const WM_COPY = &H301

Private Sub Form_Load()
Dim wWnd As Long, wWnd2 As Long

wWnd = FindWindow("SESSION_WINDOW", vbNullString)
wWnd2 = FindWindowEx(wWnd, ByVal 0&, "Term Class", vbNullString)

SendMessage wWnd2, WM_COPY, 0, 0
SendMessage wWnd2, WM_COPYDATA, 0, 0
End Sub

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 30.12.2004 (Чт) 23:16

2ANDLL:

8). Спасибо за дельный совет! *)

2Amed:

> а) ищем главное окно Гипертерминала
> б) ищем собственно окно терминала
> в) шлём WM_COPY или WM_COPYDATA

... я пробовал так:

...
Clipboard.SetText "Test"
SendMessage wWnd2, WM_PASTE, 0, 0
Clipboard.Clear
SendMessage wWnd2, WM_COPY, 0, 0
MsgBox Clipboard.GetText
...

Так как хотел прописать текст в окно гипертерминала.
А затем считать его ...
Так вот ИМХО финт ушами не проходит 8(.
Его окно не обрабатывает ни
Set \ GetWindowText ни WM_COPY \ WM_PASTE ...

Я думал что технология работы с менюшками через АПИ
уже успешно освоена всеми кроме меня 8).

А тут 8) ...

'==================================
l_hwndMenu = GD.GetMenu(Me.hWnd)

'Общее кол-во Меню
Text1 = GetMenuItemCount(l_hwndMenu)

l_hwndSubMenu = GetSubMenu(l_hwndMenu, 0)
Text1 = GetMenuItemCount(l_hwndSubMenu)

Dim Menu As MENUITEMINFO
Text1 = GetMenuItemInfo(l_hwndSubMenu, 1, 1, Menu)
MsgBox Menu.hSubMenu
'==================================

Вроде всё ОК ... вот только я не понимаю как к субменю
добраться и его активировать 8(((.


Может кто пример с вот этой радостью кинет?:

GetMenuItemInfo ...

--
Спасибо!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 30.12.2004 (Чт) 23:58

Вопрос в догонку:

Может кто подскажет как ИЗ КОДА (ИМХО программно, а не мышью -
т.е. аппаратно 8))) сэмулировать:

1. Нажатие правой клавиши - контекстное меню.
2. Выбор опред. меню и его клик - т.е. выполнение.
--
Заранее спасибо!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

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

Сообщение GSerg » 31.12.2004 (Пт) 3:41

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

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

Сообщение tyomitch » 31.12.2004 (Пт) 16:50

MSDN писал(а):The WM_MENUCOMMAND message is sent only for menus that are defined with the MNS_NOTIFYBYPOS flag set in the dwStyle member of the MENUINFO structure.


Так что слать надо WM_COMMAND.
Изображение

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

Сообщение GSerg » 31.12.2004 (Пт) 16:58

Гы. А ты откуда знаешь, стоИт ли notifybypos? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 31.12.2004 (Пт) 17:08

Тоже верно :-)
Значит, слать надо оба ;-)
Изображение

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

FRe:

Сообщение xenomorph » 01.01.2005 (Сб) 15:00

Всем спасибо за участие!

Пример - тихо вдавливает меню "Выделить всё"
в гипертерминале. Оформлено функцией.

8((*

2 Модераторы:

Проблема с закачкой: Невозможно закачать приложение в ./files/clickmp.rar.

??? Was fur ein?

В модуль:
'===============================
' Menusel sample from BlackBeltVB.com
' http://blackbeltvb.com
'
' Written by Matt Hart
' Copyright 1999 by Matt Hart

Option Explicit

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public 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
Public Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Boolean, lpMenuItemInfo As Any) As Long
Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Public Const WM_COPYDATA = &H4A
Public Const WM_COPY = &H301
Public Const WM_MENUSELECT = &H11F
Public Const WM_COMMAND = &H111
Public Const MIIM_TYPE = &H10
Public Const MIIM_ID = 2
Public Const MF_MOUSESELECT = &H8000&

Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type

Public Sub SelectMenuAndLoad(l_WindowHandle As Long, l_MenuInRowNumber As Long, l_MenuColNumber As Long)

Dim hmirc As Long, hMenu As Long, hSubMenu As Long
Dim l As Long, M As MENUITEMINFO

If l_WindowHandle Then
hMenu = GetMenu(l_WindowHandle)
If hMenu Then 'Я идиот! Убейте меня, кто-нибудь!??? ???? ?? Я идиот! Убейте меня, кто-нибудь!??
hSubMenu = GetSubMenu(hMenu, l_MenuInRowNumber)
If hSubMenu Then
M.fMask = MIIM_TYPE Or MIIM_ID
M.dwTypeData = Space$(128)
M.cbSize = Len(M)
M.cch = 128 'Я идиот! Убейте меня, кто-нибудь!? Я идиот! Убейте меня, кто-нибудь!?? Я идиот! Убейте меня, кто-нибудь!?? (2 Я идиот! Убейте меня, кто-нибудь!??? ????.???)
l = GetMenuItemInfo(hSubMenu, l_MenuColNumber, True, M)
If l Then
'MsgBox M.wID & " " & Left$(M.dwTypeData, InStr(M.dwTypeData, Chr$(0)) - 1)
End If
l = SendMessage(l_WindowHandle, WM_COMMAND, M.wID, ByVal hSubMenu)
End If
End If
End If

End Sub

'=================================
'на форму

Option Explicit

Private Sub Command1_Click()

Dim wWnd As Long

wWnd = FindWindow("SESSION_WINDOW", vbNullString)

Call mod_Aux.SelectMenuAndLoad(wWnd, CLng(Text1), CLng(Text2))

End Sub
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...


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

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

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

    TopList