2015-01-07 2 views
1

Я автоматизирую окно Excel из моего приложения Qt.Can IsWindowVisible() возвращает false при открытии окна Excel

В вопросе this я искал способ четко определить, когда окно Excel закрыто. Я не получил ответа от Stack Overflow.

Я думал о новом способе (отличном от того, как я описал в своем предыдущем вопросе). Я могу определить, закрыто ли excel. Вот.

Получить дескриптор окна Excel с помощью

excel->property("Hwnd").toInt(); 

Затем используйте IsWindowVisible() WIN32 API периодически проверять, является ли окно видимым. Если окно не видно, предположим, что excel закрыт.

Мой вопрос в том, что при нормальном использовании Excel существуют ли какие-либо сценарии, в которых IsWindowVisible() вернет false, даже если excel не закрыт?

ответ

1

Возможно, функция IsWindow() будет более подходящей здесь? Эта функция проверяет существующий дескриптор и возвращает правильный результат, когда окно действительно существует (показать или скрыть, но существовать). Но не стоит забывать, что HWND не является уникальным для окна, и если окно было закрыто и открыто снова, он получит новый HWND

if(IsWindow(someHwnd)){ 
}else{ 
} 

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

+0

В моем случае, когда пользователь закрывает окно excel, похоже, что окно не разрушено. IsWindow() возвращает true после закрытия пользователем окна. Экземпляр Excel фактически не завершен. Если я убью его с помощью диспетчера задач и снова вызвал IsWindow(), он возвращает false. –

1

Excel не закрывается, если окно все еще существует.

Это просто не видно, и вы можете автоматизировать Excel или WinWord и открывать документы, а Excel вообще не отображается.

Этот маленький код VBS начинается с того, что он делает его видимым и скрывает его снова. Ваша проверка будет всегда возвращать false, если Excel не отображается, но все еще «не закрыт».

Set oXL = CreateObject("Excel.Application") 
MsgBox "Created but not visible" 
oXL.Visible = True 
MsgBox "Created but and visible" 
oXL.Visible = False 
MsgBox "Created but not visible again " 
Set oXL = Nothing 
MsgBox "Closed (Terminated) now" 

Фактически единственный способ - проверить, действительно ли окно больше не существует (IsWindow).

Если вы ссылаетесь на конкретный документ, может быть проще проверить, все ли документы указаны в таблице IROT. Если не. Excel закрыл его.

PS: Вы должны определить «Закрыто» более точно.

+0

Что я делаю в своем приложении Qt, так это отличать некоторые данные и делать их видимыми. После этого пользователь может делать что угодно, но мое приложение Qt должно получать уведомление, когда пользователь закрывает окно. Я не могу использовать IsWindow, потому что он возвращает true, даже если пользователь закрывает окно (похоже, окно не разрушается, когда пользователь закрывается). Можете ли вы дать мне дополнительную информацию о таблице IROT, которую вы упомянули, и о том, как получить к ней доступ? –

+0

Пока вы удерживаете COM-указатель на объект Excel, этот рабочий лист (или любой другой доступ) никогда не закрывается и не завершается. Посмотрите здесь http://msdn.microsoft.com/en-us/library/windows/desktop/ms695276(v=vs.85).aspx В SDK есть программа IROTVIEW, которую вы можете использовать, чтобы посмотреть, что такое зарегистрировано. Создайте прозвище для проверки, используется ли файл. Так работает GetObject в VBS. Вы также можете использовать его. – xMRi

+0

@LahiruChandima: Обычная проблема с 'IsWindow' заключается в том, что она просто сообщает вам, является ли HWND дескриптором окна, а не тем же ли оно (Excel), которое было ранее. HWND не является GUID, они перерабатываются. – MSalters