Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2009, 20:36   #1
пасечник
Заблокирован
 
Регистрация: 24.06.2009
Сообщений: 28
По умолчанию Ссылки на ВСЕ Excel.Application (VS2008, VB .Net, Excel2002/2003)

Хотел запросто получить ссылки на все Excel.Application.
По наивности думал как-то пробиться через Process.GetProcessesByName("excel") .
Мало того, что задуманное не получилось – удивило то, что
1. для скрытых Excel в VB .NET «Process.MainWindowHandle = 0» !

Взял API FindWindowEx и AccessibleObjectFromWindow.
FindWindow видит все хэндлы. Но
2. чтобы получит ссылку на Excel, используя AccessibleObjectFromWindow, нужен хэндл окна книги – окна класса "EXCEL7".

Без окон "XLMAIN" и "XLDESK" Excel'я не может быть, но при этом окна "EXCEL7" может (если нет открытых книг) не быть вовсе! Как получить ссылку на такой Excel? Буду согласен с теми, кто (как и я) считает, что такие Excel надо сразу убивать… С этого момента можно перейти к еще одной особенности:
3. если Excel создан с помощью «New Excel.Application», почему-то его окна по отношению к (например) API «ShowWindow» или «SendMessage», порой ведут себя не как другие окна "XLMAIN"… Другие – это открытые «руками» или командой «Open»…

Бардак! Если никто не поможет получить ссылки на все/любые Excel.Application, пожалуюсь главврачу…
пасечник вне форума Ответить с цитированием
Старый 21.12.2009, 20:51   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Надо спасать от врачей

Код:

        Dim hwnd As Integer

        Dim Proc, Processes() As Process


        Processes = Process.GetProcessesByName("excel")

        For Each Proc In Processes
            hwnd = Proc.Id
   
            combo.Items.Add(hwnd)



        Next

Таким образом получаю список процессов в комбобокс ,и когда закнчиваю работать с EXCEL убиваю его принудительно,другие методы не помагают

Вопрос интересный,надо покопать в этом направлении
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 22.12.2009, 23:46   #3
пасечник
Заблокирован
 
Регистрация: 24.06.2009
Сообщений: 28
По умолчанию

Нужны-то не процессы, а ссылки на Excel.Application, чтобы использовать свойства/методы Excel.
VB9
Код:
Public Class Form1
    Dim xl As Excel.Application = Nothing

    Declare Function AccessibleObjectFromWindow Lib "oleacc" _
    (ByVal Hwnd As IntPtr, ByVal dwId As Int32, ByRef riid As Guid, _
    <MarshalAs(UnmanagedType.IUnknown)> ByRef ppvObj As Object) As Integer
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As IntPtr, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As IntPtr, ByVal y As Integer) As Boolean

    Sub XLref()
        Dim ob As Object = Nothing
        Dim XLMAIN, XLDESK, EXCEL7 As IntPtr
        Dim G = New Guid("{00020400-0000-0000-C000-000000000046}") 
        XLMAIN = FindWindowEx(0, 0, "XLMAIN", vbNullString)
        While XLMAIN <> 0 
            XLDESK = FindWindowEx(XLMAIN, 0, "XLDESK", vbNullString)
            EXCEL7 = FindWindowEx(XLDESK, 0, "EXCEL7", vbNullString)
            If EXCEL7 = 0 Then
                SendMessage(XLMAIN, 16, 0, 0) 'убить пустой EXCEL
            Else 
                ShowWindow(XLMAIN, 8) : ShowWindow(XLDESK, 8) 'SW_SHOWNA=8
                AccessibleObjectFromWindow(EXCEL7, &HFFFFFFF0, G, ob)
                xl = ob.Application
            End If
            XLMAIN = FindWindowEx(0, XLMAIN, "XLMAIN", vbNullString)
        End While
    End Sub
End Class
Хотелось это выполнить покомпактнее, без API (максимально на VB)

Последний раз редактировалось пасечник; 22.12.2009 в 23:51.
пасечник вне форума Ответить с цитированием
Старый 16.11.2015, 12:55   #4
Pabloa
Новичок
Джуниор
 
Регистрация: 16.11.2015
Сообщений: 2
По умолчанию

Будьте добры, подскажите пожалуйста, если я создаю объект "excel.application", как мне узнать Id процесса, с учетом того, что на момент создания другие процессы excel могли быть запущены, то есть Process.GetProcessesByName("EXCEL") .id может найти не тот процесс?

Последний раз редактировалось Pabloa; 16.11.2015 в 12:59.
Pabloa вне форума Ответить с цитированием
Старый 16.11.2015, 13:07   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Set xlApp = CreateObject("Excel.Application")
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.11.2015, 13:43   #6
Pabloa
Новичок
Джуниор
 
Регистрация: 16.11.2015
Сообщений: 2
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
Set xlApp = CreateObject("Excel.Application")
Я так и создаю. Только как теперь узнать ID созданного процесса?
Pabloa вне форума Ответить с цитированием
Старый 16.11.2015, 13:47   #7
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

ну а строкой
Код:
xlApp.quit
етот процесс же должен закрыться. "Случайно" другой процесс не закроете
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 16.11.2015, 14:36   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

однако... (у меня на компьютере) так:
Код:
xlID = Shell("C:\Program Files\Microsoft Office\Office12\EXCEL.EXE",1)
путь только Ваш напишите
и зачем это нужно? когда xlApp - это приложение со всеми его свойствами и методами. что такого особого Вам даст xlID???
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как программировать на VS2008 не используя .NET TLVAleXZ Общие вопросы .NET 9 27.10.2009 02:10
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47
не получается связать две формы использую с++ в проекте Windows Application Form (не MFC) VS2008 molodoy-pirat Windows Forms 2 23.04.2009 10:27
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? Unior Microsoft Office Excel 2 01.03.2009 02:42
Хелп! Перестали работать все ссылки в excel nniikkmmeenn Microsoft Office Excel 4 20.05.2008 16:57