powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / нажать ОК в messagebox
12 сообщений из 12, страница 1 из 1
нажать ОК в messagebox
    #39595023
VladimirSk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем всего доброго!
Подскажите выход.
Макрос из Excel, обращается к сторонней программке "ВВЕ" и заполняет в ней поля данными.
Затем отсылает к ней нажатие кнопки:"Добавить"

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
    
    hwndd = FindWindowEx(hwnd, 0, "AfxWnd42", "") 
    hwnda = FindWindowEx(hwndd, 0, "Edit", "") 'ComboBox Имя
    hwndb = FindWindowEx(hwndd, hwnda, "Edit", "") 'ComboBox Фамилия 
    hwndc = FindWindowEx(hwndd, hwndb, "Edit", "") 'ComboBox Отчество
    
    Button_Accept = FindWindowEx(hwndd, 0, "Button", "Add") 'Добавить
    Button_Close = FindWindowEx(hwndd, 0, "Button", "Close") 'Закрыть


Программа "ВВЕ" выдаёт message box с кнопкой ОК (Успешно добавлено)
Макрос останавливается в ожидании нажатия ОК
Каким образом эту задачу (нажатия) возложить на макрос и продолжить его работу?
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39595078
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
емнип SendMessage(BM_CLICK ...

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775985(v=vs.85).aspx

там только нюанс, что окно с кнопкой "ОК" должно быть активным наверху z-ордера окон. Иначе не сработает.VladimirSk,
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39595268
Bobgos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladimirSk,
sendkey ENTER подойдет?
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39595337
VladimirSk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bobgos, К сожалению не всё так просто, увы.(
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39595364
VladimirSk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,

Код: vbnet
1.
   SendMessage Button_Add, WM_KEYDOWN, vbKeyReturn, 0 ' нажимаем кнопку"Add"


Остановка в этом месте кода !!!
Посла нажатия кнопки "Add" макрос ожидает ответа от появившегося окна "Message",
и всё что далее, не исполняется !
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
    Sleep 100&
'------в появившемся окне уведомления нажимаем кнопку ОК----
'SendKeys "{enter}"
      hwnd_ok_win = FindWindow(vbNullString, "Message") 'находим хэндл окна "Message"
          hwnd_ok_b = FindWindowEx(hwnd_ok_win, 0, "Button", "OK") 'Кнопка
    SendMessage hwnd_ok_b, WM_KEYDOWN, vbKeyReturn, 0
    Sleep 100&
'------в появившемся окне уведомления нажимаем кнопку ОК----
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39596636
VladimirSk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,
Если бы окно (msgbox) было активным?
А как его сделать активным, если макрос стоит, не выполняется !?
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39596666
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644950(v=vs.85).aspx

SendMessage

Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644944(v=vs.85).aspx

PostMessage

Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39596850
VladimirSk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,
Спасибо !!!
С одной стороны - работает !
Но окна message не реагируют ни на что
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
hwnd_Message = 0
Do While hwnd_Message = 0 'Ожидаем появление окна и находим !!!
    Sleep 100&
      hwnd_Message = FindWindow(vbNullString, "Message")
Loop

SetFocus (hwnd_Message)
hwnd_ok = FindWindowEx(hwnd_Message, 0, "Button", "OK") 
     'AppActivate "Message"
    'Call SendMessageByString(hwnd_ok, WM_LBUTTONDOWN, 1, 0)
    'Call SendMessageByString(hwnd_ok, WM_LBUTTONUP, 1, 0)



и после окончания работы макроса остаётся куча этих самых "Message" с кнопкой ОК
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39596903
VladimirSk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladimirSk,

Код: vbnet
1.
2.
3.
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

SetForeGroundWindow (hwnd_окна)



Вот он выход - найден !
Можно и SendMessage попробовать.
Однако С П А С И Б О !!!
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39596924
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladimirSk,

1)
Не очень понимаю, что же у Вас в реальности выполняется и происходит. Но беглый поиск по I-net привел к массе сообщений, что поведение MessageBox'а меняется в зависимости от его типа. Самый не убиваемый ((( вроде MB_YESNO

Сам не проверял, но народ советует посылать

hWnd = FindWindow( .... )
If (hWnd <> 0) Then
SendMessage hWnd, WM_COMMAND, IDNO, ByVal 0&
End if

http://forums.codeguru.com/showthread.php?250538-Closing-a-Yes-No-message-box-via-code

2)
Если задача критическая и через очередь сообщений действительно не получается, то тогда остается только взять в руки C и попытаться злобно Hook в приложение повесить. Но это и достаточно сложно и в эксплуатации могут быть проблемы (с антивирусами, с правами и пр.)

Например какой то пример hook'а есть тут http://forums.codeguru.com/showthread.php?468963-sample-source-MessageBox-API-Hook Но я сам не проверял и такого в продакшинах не делал.
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39599725
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только всётаки не
SendMessage hwnd_ok_b, WM_KEYDOWN, vbKeyReturn, 0
а
SendMessage hwnd_ok_b, BM_CLICK, 0, 0
...
Рейтинг: 0 / 0
нажать ОК в messagebox
    #39599733
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и разумеется - если ваша внешняя программа вызывается через OLE из вашей экселины, и msgbox всплывает в окне программы прямо в процессе OLE-вызова из экселя, то ессно обработку нажатия "ОК" нужно писать не в этой экселине.

А в начале макроса, до начала OLE-взаимодействия с внешней программой, - запускать второй экземпляр экселя через createobject("Excel.Application"), в нём открывать какуюто дополнительную книгу (Гипервизор.xlsm :) ), вызывать в нём через application.run какойнить макрос, передавать в него hwnd программы, чтобы макрос в отдельном экземпляре экселя запустил таймер, который раз в несколько секунд будет по переданному hwnd искать всплывший msgbox и жамкать "ОК".

Тогда у Вас полноценная двухтредовая обработка получится - один "поток" взаимодействует с программой, второй давит всплывающие в ней окна, мешающие пакетной обработке.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / нажать ОК в messagebox
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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