Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как пройтись по всем открытым окошкам?


Автор: szz 24.9.2005, 15:28
Как пройтись по всем открытым в данный момент окошкам, узнать из названия(заголовки) и если у одного из них название "foobar" - закрыть его?

Автор: p0s0l 24.9.2005, 17:33
Сделай поиск по форуму, наверняка найдешь примеры.
Ищи:
EnumWindows + EnumChildWindows - Так ты узнаешь хэндлы окон.
Получить заголовок окна - GetWindowText
Закрыть окно - CloseWindow

Также возможно в твоей задаче подойдёт FindWindow + FindWindowEx, если известны заголовки родителей нужного окна...

Автор: rsm 24.9.2005, 17:50
Код

#include <windows.h>

BOOL CALLBACK EnumWindowsProc(HWND, LPARAM);

void start()
{
    EnumWindows(&EnumWindowsProc, 0);
}

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    #define WND_CAPTION "foobar"
    #define CAPTION_LEN 256
    char buff[CAPTION_LEN];
    
    GetWindowText(hWnd, (LPSTR) &buff[0], CAPTION_LEN);
    if(!lstrcmp((LPSTR) &buff[0], WND_CAPTION))
    {
        SendMessage(hWnd, WM_CLOSE, 0, 0);
        return FALSE;
    }
    return TRUE;
}

Автор: Yak 5.11.2005, 23:06
можно простым, правда не совсем красивым способом - прокрутить ч-з цикл, от i=-33000 до гдет 33000 (короче в пределах действия типа HWND) функцию IsWindow(i). если возвращает1, то окно с данным Hwnd в системе существует, если 0 - знач нет. находит все, даж мелкие кнопочки на панелях инструментов и системные окна, которые никогда не показываются сами)))))

Автор: szz 5.11.2005, 23:56
зачем? код, который дал rsm - пробегает только по открытым окошкам и все отлично работает

Автор: Helicopterr 6.11.2005, 16:49
SendMessage(FindWindow(NULL,"foobar"), WM_SYSCOMMAND, SC_CLOSE,0);

Автор: Eugene82 18.12.2005, 01:41
Цитата(Yak @ 5.11.2005, 23:06)
прокрутить ч-з цикл, от i=-33000 до гдет 33000 (короче в пределах действия типа HWND) функцию IsWindow(i). если возвращает1, то окно с данным Hwnd в системе существует, если 0 - знач нет
А как конвертируется void* HWND в int i??? У меня Билдер 6 отказывается это делать.

To rsm. И твой код билдер отказался запускать - видно ещё какую-то библиотеку подключить надо кроме windows.h. Выдаёт две ошибки (вторая я думаю из-за первой). Первая: E2034 Cannot convert 'int (__fastcall *)(void *,long)' to 'int (__fastcall *)()'

А вообще я хочу узнать заголовок окна Винампа (версия 5.1) - на Winamp v1.x не откликается! smile

Поможите кто чем может! А я потом плагином поделюсь! smile

Автор: SergeCpp 19.12.2005, 11:41
http://s0m.narod.ru/iws.html


Автор: Eugene82 19.12.2005, 16:51
Цитата(SergeCpp @ 19.12.2005, 11:41)
InqSoft Window Scanner 1.7
Спасибо! Поставил и убедился, что заголовок главного окна Винампа есть "Winamp v1.x".

Почему не работал мой код? Видать что-то пропустил, хотя компилер не ругался. Но прога всё таки не работала.

Сейчас взял текст на Object Pascal
Код

Procedure WinampCommand(Command:Integer);
var
WinampHWND:HWND;
begin
//поиск окна Winamp'a
WinampHWND:=findwindow('Winamp v1.x',nil);
//если поиск успешен, то посылаем сообщение
if WinampHWND<>0 then
SendMessage(WinampHWND, WM_Сommand, Command, 0);
end;
И переписал на С++
Код

HWND WinampHWND;
//поиск окна Winamp'a
WinampHWND=FindWindow("Winamp v1.x",0);
if(WinampHWND!=0)//...
//...
Прога заработала!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)