Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как скрыть окна некой проги а потом открыть только те которые били видны до скрытия?

538
08 мая 2010 года
AVDEY
188 / / 17.11.2005
Есть прога. Нужно срыть открытие окна и затем показать только те которые были видны до скрития.

Получаю PID по наименованию .exe
Код:
DWORD WINAPI GetProcessID(const char* NameFile)
{
    HANDLE hProcSnap = NULL;
    PROCESSENTRY32 ProcessEntry32;
    ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
__try
   {
    hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   
    if((int)hProcSnap == -1) throw;
   
    Process32First(hProcSnap, &ProcessEntry32);

        do{
        if(!strcmp(ProcessEntry32.szExeFile, NameFile))
                return ProcessEntry32.th32ProcessID;
                }while(Process32Next(hProcSnap, &ProcessEntry32));
   }
__finally
    {  if(hProcSnap)CloseHandle(hProcSnap);   }

    return 0;
}


потом ищу окна которые принадлежат найденному PID
Код:
HWND WINAPI GetHWND(DWORD ProcesID,HWND hWnd=NULL)
{
    if(!hWnd)
    {
    hWnd=NULL;
    hWnd=::GetDesktopWindow();
    hWnd=::GetWindow(hWnd,GW_CHILD);
    }
    while(hWnd)
    {
        hWnd=::GetWindow(hWnd,GW_HWNDNEXT);
        DWORD dwProcID;
        GetWindowThreadProcessId(hWnd,&dwProcID);
        if(dwProcID==ProcesID) return hWnd;
    }
    return NULL;
}

При переборе приложение находить около 180 HWND.

Как вариант скрития выбрал такой:
 
Код:
do{
::ShowWindow(hWnd,SW_HIDE);
}while(hWnd=GetHWND(GetProcessID("MyProg.exe"),hWnd));

а вот при открытии тем же способом появляется окон 10 а до скрытия было 2.

Рассуждая логически то все так и должно происходить.

А чтобы было как мне надо, тогда нужно запомнить в каком то массиве значение showCmd, а потом восстановить.

Проблема в получении showCmd.
Так вот пытаюсь узнать состояние окна таким способом:
 
Код:
WINDOWPLACEMENT BUF;
BUF.length=sizeof(WINDOWPLACEMENT);
do{
::GetWindowPlacement(hWnd,&BUF);
::ShowWindow(hWnd,SW_HIDE);
printf("%i",BUF.showCmd);
}while(hWnd=GetHWND(ProcessID,hWnd));

но все значения BUF.showCmd равны 1 = SW_SHOWNORMAL;
соответственно в обратном порядке показываются опять все окна?

У кого какие идеи и варианты решения данного вопроса?
399
09 мая 2010 года
KIV
432 / / 20.01.2009
Во-первых, скрывать/показывать только те окна у которых GetParent(hWnd) == 0.
Не зачем скрывать элементы управления. У вас появляется 10 окон на экране или просто ShowWindow выполняется 10 раз? если второе, то это и есть дочерние окна, которые, разумеется, были видимы.
538
09 мая 2010 года
AVDEY
188 / / 17.11.2005
именно окон 10.
Возьмём к примеру winamp.exe. Отдельными окнами реализовано: плелист, еквалайзер, окно управления, и.т.д.
Так вот, если я закрыл окно плейлиста и осталось только окно управления то при сканировании находятся все окна, так как закрытие плейлиста просто переводить окно в ShowWindow(SW_HIDE);
7
09 мая 2010 года
@pixo $oft
3.4K / / 20.09.2006
Так ты сохраняй состояние видимости окна,и будет тебе щастье.В дальнейшем при показе будешь смотреть–если оно не было SW_Hide,то покажешь
538
09 мая 2010 года
AVDEY
188 / / 17.11.2005
Так вот именно, не получается получить видимость окна.
"
Проблема в получении showCmd.
Так вот пытаюсь узнать состояние окна таким способом:
Код:
 
Код:
WINDOWPLACEMENT BUF;
BUF.length=sizeof(WINDOWPLACEMENT);
do{
::GetWindowPlacement(hWnd,&BUF);
::ShowWindow(hWnd,SW_HIDE);
printf("%i",BUF.showCmd);
}while(hWnd=GetHWND(ProcessID,hWnd));

но все значения BUF.showCmd равны 1 = SW_SHOWNORMAL;
"
538
10 мая 2010 года
AVDEY
188 / / 17.11.2005
Я конечно так и не понял почему функция ::GetWindowPlacement не возвращает стиль окна, и если кто объяснит то буду рад, но нашел другую функцию, которая возвращает видимо окно или нет:
::IsWindowVisible(HWND hWnd);
Всем спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог