powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нажать кнопку меню в другой программе?
25 сообщений из 35, страница 1 из 2
Нажать кнопку меню в другой программе?
    #33249650
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли из программы VBA (написав код) нажать кнопку меню в другой программе (программа Металикс написаная на С++)???

На этой программе происходит перевод чертежей деталей с инструментами (пробивочных) в коды НС. Стандартные детали я параметрирую.
В самой программе есть редактор, который создает файл.РРО
В этом редакторе можно записать все данные параметрической программы
построчно на сколько угодно деталей, нажать кнопку пуск и получаешь все
все графические файлы с чертежами деталей .

У меня есть программа на VBA которая создает файл.РРО с нужными мне данными . Но теперь я должен открыть Металикс , нажать кнопку и открыть
редактор .РРО, наити свой созданный моей прогой файл.РРО-открыть его и запустить , нажав кнопку пуска!!!!
Как же мне эти действия выполнить через VBA, вообще возможно ли это???
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33249899
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, если у этой программы все нужные действия можно выполнить только нажатием клавиш на клавиатуре. Пример с калькулятором:
Открывается приложение калькулятор и вызываетя меню "О программе"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub CallCalc()
    Dim ReturnValue
    ReturnValue = Shell("CALC.EXE") ' Запускает калькулятор.
    AppActivate ReturnValue         ' Активизирует калькулятор.
    SendKeys "%", True          ' Нажатие ALT (вызов меню)
    SendKeys "{RIGHT 2}", True  ' Нажатие стрелки вправо 2 раза
    SendKeys "{DOWN 2}", True   ' Нажатие стрелки вниз 2 раза
    SendKeys "{ENTER}", True    'Вызываем меню "О программе"
    'SendKeys "%{F4}", True  ' ALT+F4 закрывает окно "О программе"
    'SendKeys "%{F4}", True  ' ALT+F4 закрывает калькулятор
End Sub
Соответственно, если приложение поддерживает горячие клавиши,
то вместо всех инструкций SendKeys можно прописать всего одну.
Остальное найдешь в справке VBA
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33250671
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но может у кого еще есть какие то решения???? Советы???
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33250780
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vallotСпасибо, но может у кого еще есть какие то решения???? Советы???
А чем предыдущее решение не устраивает?
Можно посылать еще WM_COMMAND , например.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33250787
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решения и советы могут быть если эта прога :
- поддерживает OLE или DDE
- API в виде DLL
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33251029
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
----Решения и советы могут быть если эта прога :
- API в виде DLL -----

Это присутствует!
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33253213
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А стрелки, увы, стоят на месте!!!!
Да и если они приползут на кнопку, то
как ее запустить? Кнопка реагирует на нажатие мыши, а на ENTER -нет!
Эхе..хэ.....
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33254007
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vallotА стрелки, увы, стоят на месте!!!!
Да и если они приползут на кнопку, то
как ее запустить? Кнопка реагирует на нажатие мыши, а на ENTER -нет!
Эхе..хэ.....
1. Это ты про калькулятор или про свою прогу Металикс?
Если про свою, то скажи спасибо программисту.
2. Может у этой кнопки горячая клавиша есть?
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33254965
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет горячих клавиш, увы мне, увы..!
Но есть идея попросить их создать горячие клавиши!
Они постоянно апгрейты присылают, может выкручусь!

А вообще то жалко, что хакеров на форуме нет...,
щас бы вмиг бы решили проблему мою!!!!
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33255611
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура, нашел!!!

Помогите, у кого есть опыт.

Например имеется файл Vova.dll, а в нем есть строчка:


OriginalFirstThunk: GetEnvironmentVariableW(337)
FirstThunk: GetEnvironmentVariableW(337)

Как мне при написать код, чтобы выполнилась длл-команда из моей проги???
Подскажите, кто знает!!!!
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33256606
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
..........и тишина!? Э...хе...хе!!!.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33258063
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vallot..........и тишина!? Э...хе...хе!!!.
Так почитайте о GetEnvironmentVariable - и чем это может помочь?
Я уже предложил вариант.
Подробнее - берется spy++ или winspector и изучается приложение - нужно узнать класс окна и код сообщения. По шагам:
1. Запустить приложение
2. Запустить Spy++
3. Выбрать Find Window (выглядит вроде как бинокль)
4. Оттащить на окно приложения
5. щелкнуть по Messages и OK.
6. в Spy++ появится пустое окно. Выберите тот пункт меню в вашем приложении, который вам нужен и нужные сообщения должны появиться в окне Spy++.
В winspector - аналогично.
Потом пишете код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_COMMAND = &H111

Sub zzz()
Dim hwd As Long
Dim CommandId As Long
CommandId = 'идентификатор нужного пункта меню, который узнали 
hwd = FindWindow("WindowClassВашегоПриложения", vbNullString)
PostMessage hwnd, WM_COMMAND, CommandId,  0 
End Sub
Соответственно для одного пункта меню или нажатия кнопки - если нужно несколько, делаете PostMessage столько раз, сколько нужно - с нужными значениями CommandId.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33258104
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спасибо, за подсказку , а то я самоучка и тяжело методом тыка,
а сейчас хоть есть зацепка!!!
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33259944
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, рано обрадовался!

Все нашел , все установил, разобрался(?) что к чему,
но тут заковыка такая - winspector находит все компоненты в
Металиксе, но если это, например, виндюковские окна диалогов .

А в тулбарах Металикса находит только тулбары !!! А в одном окне тулбара находится 3-6 кнопок , а их то он и не определяет и что только не делал!
Оставлял одну кнопку на тулбаре, все равно показывает как тулбар,
что делать не знаю! Как заставить, чтобы кнопки в тулбарах показывало?
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33260334
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vallotКак заставить, чтобы кнопки в тулбарах показывало?
А зачем? Если я правильно помню, сообщения WM_COMMAND обычно посылаются главному окну приложения.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33260417
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну как же, ведь у меня в тулбаре 1 находится кнопки -
1-Run AutoNesting
2-Run Parametric
3- Run Order File

Как же прога будет знать, что именно Run Order File надо запустить,
или я чего то не догоняю??? Увы мне..
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33260473
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vallot
Как же прога будет знать, что именно Run Order File надо запустить,
или я чего то не догоняю??? Увы мне..
Если я правильно помню (много лет уже WinApi не использовал :) ) - тулбар получает сообщение о щелчке мышой с указанием координат. (Похоже, кнопки не являются окнами сами по себе). После этого тулбар проверяет, что за кнопка есть по этим координатам. Если это Run Order File - тулбар посылает главному окну сообщение WM_COMMAND с параметром - каковой параметр и есть id команды Run Order File. То же сообщение может послать и меню, например, и ваша программа.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33260825
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я прошу прощения, я наверное ввел в зблуждение Вас своим "ламерским"
языком , под словом "кнопка" я имел ввиду Command Button !
И как я уже говорил, в некоторых диологовых окнах определяет как "Button"!
И еще вопрос-

CommandId = 'идентификатор нужного пункта меню, который узнали

Как я это могу определить, если Command Button !(Run Order File)
не отражается, или это что-то другое?
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33260977
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vallot
Как я это могу определить, если Command Button !(Run Order File)
не отражается, или это что-то другое?
Следите за главным окном - какие ему приходят сообщения, когда вы нажимаете кнопку на тулбаре или выбираете пункт в меню? Будет много - целая куча mousemove, mouseup, mousedown. Одно из них может быть WM_COMMAND - это и нужно.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33282545
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот для примера создал на VB6 проект "Vova", в проекте есть форма, на ней CommandButton для выполнения кое каких действий в
TextBoxe .
Через Winspector Spy нашел все для CommandButton :

000601В6: ThunderCommandButton "cmdVova"

А на VBА (чтобы нажать CommandButton из другой программы) сделал по совету так:


'===========================================================
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_COMMAND = &H111

Private Sub Command1_Click()
Dim hwnd As Long
Dim CommandId As Long
CommandId = 2
hwnd = FindWindow("ThunderCommandButton", vbNullString)
PostMessage hwnd, WM_COMMAND, CommandId, 0
End Sub
========================================================
Но это не работает, почему? По моему нету ссылки на проект VB6 ,
кто может помочь???
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33321244
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Второй раз поднимаю эту тему, но теперь надеюсь что вопрос будет понятен до конца!!!
Прочел много помощи, вроде(?) делаю все правильно, но не получаю результата, ПОЧЕМУ???
Подскажите пожалуйста, сам уже неделю бьюсь!!!
--------------------------------------------------------------------------------
Эксперементирую с "Notepad" , выполняю следующие действия:
1)Открыть "Notepad"
2)Открыть "File" в Menu
3)Открыть "Open" в SubMenu
4)Выбрать File "Вася"
5)Нажать кнопку "Open"
'=============================================================
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) 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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As
String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam
As Long, ByVal lParam As Long) 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 Sub Command1_Click()
Dim hwnd As Long
Dim hMenu As Long
Dim hMenuItm As Long
Dim hMenuSub As Long
Dim hwndOpen As Long
Dim hwndBtnOpen As Long
Dim RetVal
Private Const WM_ACTIVATE = &H6
Const WM_COMMAND = &H111
'---------------------------------------------------
RetVal = Shell("notepad.exe")
AppActivate RetVal
'-----------------------------------------------------
hwnd = FindWindow(vbNullString, "Untitled-Notepad") 'находим хэндл окна "Notepad"
hMenu = GetMenu(hwnd) 'находим хэндл окна меню
hMenuItm = GetMenuItemID(hMenu, 0) 'находим хэндл "File"
PostMessage hMenuItm, WM_COMMAND, 0, 0 'Открыть "File" в Menu
hMenuSub = GetSubMenu(hMenuItm, 1) 'находим хэндл "Open" в SubMenu
PostMessage hMenuSub, WM_COMMAND, 0,0 'Открыть "Open" в SubMenu'
-----------------------------------------------------
hwndOpen = FindWindow(vbNullString, "Open") 'находим хэндл окна "Open"
hwndBtnOpen = FindWindowEx(hwndOpen, "Button", "Open")'находим хэндл кнопки "Open"
SendMessage hwndOpen, WM_ACTIVATE, 1&, 0 'делаем окно "Open" активным
выбрать нужный файл-????????- не знаю как это сделать

SendMessage hwndBtnOpen, BM_CLICK, 0, 0 'нажать кнопку "Open"
End Sub
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33321849
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так же найти хендл поля "Имя файла", и прописать туда текст с именем файла.
Через SendMessage, например.
А потом "Open".
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33321857
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
текст с именем файла с полным путём , да.
В этом диалоге (Открытие файла) не обязательно же по папкам путешествовать, можно просто вписать нужное имя.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33322013
vallot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том , что я специально задал вопрос по Notepad, потому что он у всех под рукой и можно коды мои проверить!
А мои файлы .РРО можно открыть только, если, именно в моем приложении Металикс "путешествовать"!!!
А в данном случае-

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

hwnd = FindWindow(vbNullString, "Untitled-Notepad") -почему то возращает "0", значит не находит "Untitled-Notepad"!!!!
ПОЧЕМУ???? и т. д.
...
Рейтинг: 0 / 0
Нажать кнопку меню в другой программе?
    #33322186
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может. заголовок не совпадает.
У меня находит, но у меня строка выглядит так:
MsgBox FindWindow(vbNullString, "Текстовый документ.txt - Блокнот")
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нажать кнопку меню в другой программе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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