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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2013, 09:21   #1
c-net
 
Регистрация: 16.08.2011
Сообщений: 3
По умолчанию Handle окон Outlook. Некорректная работа.

Добрый день. Буду рад услышать мнение по нижеописанной проблеме.

Работа ведется в Access 2007 и Outlook 2007.
В аксессе открываются формы, им устанавливается setwindowpos hwnd_topmost -1.
Их может работать несколько штук одновременно. Все отлично работает.

Затем мне необходимо было, чтобы из Аксесса формировалbсь письма Аутлук(с одинаковой темой), и отображалbсь поверх всех форм, даже тех которые отобразились ранее(как я описал) с возможностью переключения между формами и письмами, причем активное окно должно быть поверх всего.

Задачу решил перебором всех открытых окон, с определением handle по части заголовка письма и устанавливал окнам с этим handle hwnd_topmost -1. Все отлично работает, !НО с одним косяком:

по окончании работы(отправка писем, или закрытие аксесса) обнаружилось, что Outlook продолжает новые сообщения или сообщения открытые в отдельном окне отображать с параметром hwnd_topmost -1, что очень неудобно для пользователя - окно убирается только сворачиванием, переключением фокуса(активацией другого окна) оно не убирается.

Мои гипотезы: 1)при закрытии определенных писем, или их отправке, их Хэндл может назначаться другим письмам, а свойства этого Хэндла сохраняется, что и приводит к отображению поверх всех.
2) мой код "цепляет" другие хэндлы помимо целевых(по теме письма), которые учавствуют в работе Outlook и ставит их поверх всех.

соответственно вопросы. Какая из гипотез похожа на правду и как решить?

Если есть другое решение или варианты возникновения/устранения проблемы - вы очень поможете)

Код прилагаю


Код:
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function IsIconic Lib "user32.dll" (ByVal hwnd As Long) As Long

Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
 Const HWND_TOPMOST = -1 'HWND_TOPMOST = -1
    Public Const SWP_NOSIZE = &H1
    Public Const SWP_NOMOVE = &H2
    Public Const HWND_NOTOPMOST = -2

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
  ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public isk As Integer

Dim strCaptions() As String
  ' Здесь будут лежать заголовки всех найденных окон
  Public lngHandle() As Long
  ' А здесь все хэндлы этих окон
  Public Function Outlook_Find(strCaption As String) As Boolean
   Dim iCount As Integer
   Dim Pos As Integer
   Dim lngEnum As Long

   ReDim strCaptions(0) ' Обнуляем  массив от возможных прошлых результатов
   ReDim lngHandle(0) ' то же чистим
   lngEnum = EnumWindows(AddressOf Callback1_EnumWindows, 0)
' вот эта функция будет циклически вызвана столько раз,' сколько будет найдено окон
' т.е. после ее выполнения оба массива будут наполнены
   For isk = 0 To UBound(strCaptions)
' перебираем эти массивы
Pos = InStr(1, strCaptions(isk), strCaption, vbTextCompare)
' ищем строку, которая должна характеризовать' искомое окно
If Pos > 0 Then

poehali 'все необходимые действия с окнами

iCount = iCount + 1
End If
   
Next
   
   If iCount >= 1 Then
    okna_outlook= True ' работа выпонена
  Else
   okna_outlook= False 'такое окно не найдено
   End If
   
End Function
Public Function Callback1_EnumWindows(ByVal hwnd As Long, _
 ByVal lpData As Long) As Long
 Dim cnt As Long
   Dim rttitle As String * 256
   cnt = GetWindowText(hwnd, rttitle, 255)
' ищем следующее окно
   If cnt > 0 Then ' нашли, тогда добавляем элемент в массивы
ReDim Preserve lngHandle(UBound(strCaptions) + 1)
ReDim Preserve strCaptions(UBound(strCaptions) + 1)
strCaptions(UBound(strCaptions)) = Left$(rttitle, cnt)
lngHandle(UBound(lngHandle)) = hwnd
   End If
   Callback1_EnumWindows = 1 ' продолжаем перебирать
End Function


Public Sub okna_outlook()
Outlook_Find "ВД. Замечание"
End Sub

Sub poehali()

If IsIconic(lngHandle(isk)) Then ShowWindow lngHandle(isk), SW_RESTORE
      SetForegroundWindow lngHandle(isk)
      SetWindowPos lngHandle(isk), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End Sub

Последний раз редактировалось c-net; 02.04.2013 в 12:53.
c-net вне форума Ответить с цитированием
Старый 05.04.2013, 10:05   #2
c-net
 
Регистрация: 16.08.2011
Сообщений: 3
По умолчанию

сейчас попробую реализовать промежуточное решение: при выходе икать окна по классу rctrl_renwnd32 (класс сообщений Outlook) и выставлять необходимые параметры.

следующим шагом буду думать как при работающем аксессе находить сообщения которые уже отправлены(возможно по записи хэндла в доп. таблицу) и по таймеру назначать параметры. по выполнению отпишусь может кому понадобится.
c-net вне форума Ответить с цитированием
Старый 05.04.2013, 10:27   #3
c-net
 
Регистрация: 16.08.2011
Сообщений: 3
По умолчанию

вот промежуточное решение про которое я писал выше.
Код:
Public Sub repair_Outlook()
Dim w_Outlook() As Long
Dim vItem
 
ReDim strCaptions(0)
lngEnum = EnumWindows(AddressOf Callback1_EnumWindows, 0)
ReDim w_Outlook(UBound(strCaptions))
 
For isk = 0 To UBound(strCaptions)
w_Outlook(isk) = FindWindow("rctrl_renwnd32", vbNullString)
Next
 
With CreateObject("Scripting.Dictionary"): .CompareMode = vbTextCompare
      For Each vItem In w_Outlook
         If vItem <> "" Then
         .item(vItem) = .item(vItem) + 1
         End If
      Next
    
    For Each k In .Keys
    SetWindowPos k, -2, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
    Next
    
End With
 
End Sub
c-net вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректная работа кода [C++] madmaniac Помощь студентам 1 10.03.2012 15:50
Некорректная работа программы... HyperZen Общие вопросы Delphi 2 03.07.2011 10:46
Список открытых окон (Handle) Paul Hindenburg Фриланс 4 08.10.2010 13:04
Как узнать Handle всех окон с заданным названием? Ga-sergey Win Api 3 24.05.2010 23:35
Некорректная работа Ucoz.ru docbrain WordPress и другие CMS 7 31.03.2010 11:26