Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Некорректно работает API ShowWindow

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

McConst

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
Делаю программу, которая в перспективе должна будет проверять объявления в интернете, и если найдет удовлетворяющие поиску объявления, останавливается.
Предполагаю, что поиск будет выполняться в неактивном окне Excel, и при появлении результата, окно Excel должно раскрываться на весь экран поверх всех остальных окон. Проверку активности/неактивности окна и его раскрытие реализовал через API функции в процедуре house
 
Проблема вот в чем, окно максимизируется, но остается на заднем плане. Ексель начинает мигать. Но мне-то надо, чтобы он появлялся на переднем плане. Вставил в код минимизацию активного окна. Тоже не работает. В переменную RES возвращается код ошибки 0 (см. последние строки процедуры). Не пойму почему функция не работает так, как указано в описании. Прикладываю файл. Кнопка запуска макроса в левом верхнем углу.
 
API задекларированы в модуле API, константы API прописаны там же. Код процедуры house приведен ниже, а файл с работающим каркасом проекта здесь http://yadi.sk/d/aocSyKi36wvva
 
Public Sub house()
'Поиск в интернете свежих объявлений о сдаче квартир с отсеиванием объявлений агентств
'по черному телефонному списку
'
'
'
Dim i As Integer, j As Integer 'счетчики в циклах
Dim lastRow As Integer ' последняя строчка на листе с объявлениями (конец объединенной строки)
 
'Переменные для работы с API
 Dim Res As Long 'Результат выполнения функции
 Dim HandleAW As Long        'Описатель активного окна
 Dim hwnd As Long ' Описатель приложения Excel
 
ActiveWindow.ScrollRow = 10
UserForm1.ListBox1.Clear
 
'Инициализация черного и серого списка телефонов
If Worksheets("Объявления").CheckBox2 Then
    PhoneBlackListReading
    If Worksheets("Объявления").CheckBox3 Then
    'Корректируем черный список согласно исключениям серого списка
        PhoneGrayListReading
        NewBlackList Count:=PhoneBlackListCount, BlackList:=PhoneBlackList
    End If
End If
 
 
'Построчная инициализация массива старых объявлений
lastRow = Worksheets("Все объявления").Cells(Rows.Count, 1).End(xlUp).Row
OldFlatCount = 0
For i = StartRow To lastRow Step 3
    OldFlatCount = OldFlatCount + 1
    OldFlat(OldFlatCount) = ReadRow(i)
Next i
 
'Определяем, активно ли окно Excel. Получаем Handle активного окна
HandleAW = GetActiveWindow
 
'Загрузка списка новых объявлений из интернета
If Application.hwnd <> HandleAW Then
'Если поиск начался при свёрнутом или неактивном окне
    Worksheets("Объявления").Label12.Caption = "Идет поиск в скрытом режиме"
    UnactiveWindow = True
    UserForm1.TutBY
Else
'Поиск при развернутом окне
    UnactiveWindow = False
    UserForm1.Show
End If
'Отсеивание объявлений согласно поисковому запросу
Elimination
 
Application.ScreenUpdating = False
'Сохраняем скачаные списки объявлений на вкладку "Все объявления"
SaveNewAdvertisment
 
'Выводим на лист "Объявления" новые объявления
ShowNewAdvertisment
 
Application.ScreenUpdating = True
'Проверяем, активно ли окно перед завершением операции
HandleAW = GetActiveWindow
hwnd = Application.hwnd
If (hwnd <> HandleAW) Then  '(VisibleFlatCount > 0) And
    'Если окно неактивно и найдено новое объявление, окно раскрывается на весь экран
    Worksheets("Объявления").Label12.Visible = False
    Worksheets("Объявления").Buttons(1).Caption = "Начать отслеживание"
    Worksheets("Объявления").Protect DrawingObjects:=True, Contents:=True, Scenarios:=False
    Res = ShowWindow(HandleAW, SW_SHOWMINIMIZED)
    Res = ShowWindow(hwnd, SW_SHOWMAXIMIZED)
    Res = SetForegroundWindow(hwnd)
    DoEvents
    End
End If
End Sub

Всего записей: 18 | Зарегистр. 17-08-2009 | Отправлено: 23:56 17-07-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нельзя сделать окно верхним, не объеденив очереди сообщений верхнего на данный момент окна и окна, который надо сдвинуть в самый верх. На C это делается примерно так:
 
#include <windows.h>
BringToTop(HWND hWin)
{
    int id, id2;
    if(IsIconic(hWin))                                    //are we in tray?
    {
        ShowWindow(hWin, SW_RESTORE);                     //restore to desktop
        UpdateWindow(hWin);
    }
    
    id = GetWindowThreadProcessId(GetForegroundWindow(), 0);
    id2 = GetWindowThreadProcessId(hWin, 0);
    if(id != id2)                                          //are we on top already?
    {
        AttachThreadInput(id, id2, TRUE);                  //connect threads
        BringWindowToTop(hWin);                            //go top
        AttachThreadInput(id, id2, FALSE);                 //disconnect threads
    }
}

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 16:00 18-07-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Некорректно работает API ShowWindow


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru