Страницы: 1
RSS
можно закрыть программу из Excel?
 
Знатоки подскажите, можно ли из Excel макросом закрыть другую программу, а именно запускаемую при выводе на печать через Microsoft Office Document Image Writer?  
 
У меня на компе он сам закрывается, а на других компах остается висеть.  
 
Заранее благодарен за помощь.
 
В Гугле забанили? http://www.bigresource.com/Tracker/Track-vb-Qq3GbhQKve/
 
Спасибо за ссылку.  
 
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 DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long  
Const WM_CLOSE = &H10  
 
Private Sub Command1_Click()  
 
   Dim hApp As Long  
   hApp = FindWindow(vbNullString, "Calculator")  
   Call SendMessage(hApp, WM_CLOSE, 0, 0)  
   Call DestroyWindow(hApp)  
 
End Sub  
 
Вот что там выложено. Насколько я понимаю здесь запускается еще макрос DestroyWindow, но его найти я не смог. Поэтому вопрос меня мучает до сих пор :(
 
A как ее вытащить к себе? у меня комп ругается на эти строки когда вставляю внутрь существующего макроса
 
На счёт теории вы правы, специально никто не обучал, сам по книжкам ковыряюсь и здесь в форуме.  
 
после написанного сам попробовал их вверх модуля поставить, теперь не ругается, но и hApp = FindWindow(vbNullString, "Microsoft Office Document Image Writer") ничего не находит. Видимо из-за того что на каждом компе для вывода Writer запускаются разные программы (я уже 3 видел). Как это решить?  
 
Или меня опять подводит теория? :)
 
Полазил почитал про API и родил версию, что в hApp = FindWindow неправильно задается имя окна которое открывается во время вывода на Writer.  
 
Можно определить имя этого окна?
 
а оно может быть разным?  
 
ps да и при получении команды wm_close окно само уничтожится..
 
Тогда как должно звучать/писаться имя окна в которое на печать через Microsoft Office Document Image Writer?
 
Sub CloseImageWriter()  
   Dim hApp&  
   hApp = FindWindow("PrintUI_PrinterQueue", vbNullString)  
   Call SendMessage(hApp, WM_CLOSE, 0, 0)  
   Call DestroyWindow(hApp)  
End Sub
 
И так не получилось.  
Может с EnumWindows и GetWindowsText перебор имен окон сделать? вот только сам пока не соображу как.
 
Одно из 2-х :-)  
 
1. Либо имеем дело с Excel 2010, тогда код должен выглядеть так:  
 
#If VBA7 Then  
 Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr  
 Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr  
 Declare PtrSafe Function DestroyWindow Lib "user32" Alias "DestroyWindow" (ByVal hwnd As LongPtr) As Long  
#Else  
 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 DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long  
#End If  
Const WM_CLOSE = &H10  
 
Sub CloseImageWriter()  
 Dim hApp&  
 Do  
   hApp = FindWindow("PrintUI_PrinterQueue", vbNullString)  
   If hApp = 0 Then Exit Do  
   Call SendMessage(hApp, WM_CLOSE, 0, 0)  
   Call DestroyWindow(hApp)  
 Loop  
End Sub  
 
2. Либо ищем не то окно, я приложил рисунок окна, для закрытия которого написан код. Если окно другое, то приложите его картинку.  
 
3. Либо что-то с кодом - приложите Excel-книгу с кодом
 
Не надеялся уже на ответ и долго не смотрел форум. ZVI, спасибо за участие в проблеме.  
Работаю на Excel 2003. Проблема в том что на разных компах при выводе печати на Microsoft Office Document Image Writer ассоциации происходят на разные программы: Imaging, MsOf Document Imaging, а дома вообще на какой-то Фотоальбом (фото прикладываю)  
Почитал про Win32 API, сделал перебор окон и вывод их имен (EnumWindows и GetWindowText), но по заголовкам не могу опознать этот фотоальбом. На работе предлагаемый вами вариант PrintUI_PrinterQueue видел. Но нужно чтобы находил это окно на любом компе.    
Что еще можно сделать?
Страницы: 1
Читают тему
Наверх