Hook на окно Excel

Программирование на Visual Basic for Applications
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Hook на окно Excel

Сообщение Avtopic » 06.02.2007 (Вт) 13:21

Здравствуйте!
Из Vb создаю и открываю Excel книгу.
Моя задача состоит в следующем:
после открытия Excel книги, связать окно формы Vb и окно того экземпляра Excel, которую сам запустил по следующему принципу, форма Vb постоянно сверху и одно окно повторяет состояние другого (кроме состояния “развернуто”).
Т.е. форма Vb на переднем плане, на втором Excel. свернули одно из них свернулись оба, развернули - развернулся Excel, форма нормально на переднем плане. Активизировали форму, появилась она под ним Excel. и.т.д. если ясно все передал.

Что пробовал сам: Поставил Hook на форму и мучаюсь с ним и мучаю систему.
в результате если делаю действие с формой, воздействие на Excel чтобы был на второй позиции (исключительно на втором) и все остальное сделал сравнительно легко, (даже сделал Docking этих двух окон, но потом отказался от этой затей).

а вот взять под контроль окно открытой книги, когда делаю действие с ним, не удается.

1. Хочу совет в лучшую сторону.
2. если ставить Hook только на форму, существует или нет сообщение о перемене в ZOrder всех окон и как его перехватить (спрашиваю “сообщение” о перемене в ZOrder а не перебор позиции всех окон DeferWindowPos).

Спасибо!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.02.2007 (Вт) 13:47

Ты учитываешь, что Excel -- это MDI-приложение?
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 06.02.2007 (Вт) 14:24

Один офтоп, чистил у себя и кууки и все, но последние месяца два, полтора еле захожу на форум
(имею в виду не логин, а сервер как будто тормозит), это общая проблема, или опять причину искать у себя?
15...20 минут посылаю это сообщение.


alibek писал(а):Ты учитываешь, что Excel -- это MDI-приложение?
Мне бы справится с ситуацией, когда открыт один экземпляр Excel-я, для многих экземпляров, как-то по тексту Title-а или по другому атрибуту доберусь до своей, я же его создаю и открываю.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.02.2007 (Ср) 9:42

А не поможет Private WithEvents xlBook As Excel.Workbook? И обрабатывать соответствующие события объекта.
Salus populi suprema lex

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 07.02.2007 (Ср) 12:29

Да, но эти события срабатывают только внутри аппликации, и молчат
когда происходит активация-деактивация окона Excel по отношению
к другим программам.

Как я понял, вместо WindowsHook лучше использовать WindowProc и
обрабатывать событие WM_ACTIVATEAPP, но установить WindowProc
на окно Excel не удается, а это сообщение при активации-деактивации
окон других программ, во все окна не посылаются ...

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.03.2007 (Сб) 19:05

Здравствуйте! Продолжу здесь же.

:oops: Вопрос может быть очень простой, может вообще позорный, но больше некуда обратится.

Как написано выше, стараюсь установить глобальный Hook.
За основу взял исходник dll-а от tyomitch-а.

hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, AddressOfHookProc, DllBase, 0)
само по себе, задачу осуществил, спасибо опять, тому же tyomitch-у
Хочу загрузить dll сам, а не привязывать в референсах.

Вот, если работает из “апи гуид”

lb = LoadLibrary("user32")
pa = GetProcAddress(lb, "SetWindowTextA")

почему не работает

lb = LoadLibrary("C:\Documents and Settings\Avtopic\Desktop\Tiomich\prjHook")
pa = GetProcAddress(lb, "AddressOfHookProc") AddressOfHookProc - это имя свойство в dll

подумал, из-за того, что AddressOfHookProc это свойство, вынес в модуль специально для него функцию “aHookProc”
pa = GetProcAddress(lb, "aHookProc ")
результат 0.
переделал в публик другие функции, проверил GetProcAddress для них, безрезультатно, возвращает 0.

как подключить dll программно.
Спасибо, заранее.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.03.2007 (Сб) 19:33

Какой ужас...

Avtopic, не комментируя написанное, ибо страшно, всё же скажу, что нет ни одной причины не подключать activex dll в референсах, а загружать самому.
Сформулируй словами, зачем тебе нужно "загрузить dll сам, а не привязывать в референсах".
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.03.2007 (Сб) 20:14

Ужас что? Что я стараюсь его подключить или другое?

Зачем мне это нужно:

1. при каждом изменении в коде DLL не удается перекомпилировать его. Никак не смог найти, что использует DLL, во всяком случае, такое сообщение выходит и не позволяет переписать старую DLL, хоть отвязывай в референтах хоть закрой приложение, которое его использует. Приходится каждый раз выходить из Windows.

2. интересует сильное удивление от прочитанного, что нельзя позднее привязывать DLL :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.03.2007 (Сб) 20:33

1. Библиотеку глобального хука используют все процессы в системе. Выгрузить её из них нельзя.
2. Сильное удивление возникает от каши в голове автора по теме "dll", в частности, столь вопиющая попытка обращаться с activex dll как с native. Функция CreateObject знакома?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.03.2007 (Сб) 20:45

Ужас. :oops: :oops:
знакома, спасибо!
В голове не каша, там ад.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList