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

Ваш аккаунт

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

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

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

Как, зная HWND кнопки на TaskBar, найти HWND соответствующего окна приложения?

535
10 июня 2008 года
Нездешний
537 / / 17.01.2008
Собственно, вопрос в заголовке :)
246
10 июня 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Нездешний
Собственно, вопрос в заголовке :)


На кнопке таскбара заголовок окна, т.е. кнопке->WM_GETTEXT потом FindWindow(по заголовку)
Только откуда ты хендл кнопки берешь?

1.9K
10 июня 2008 года
max_dark
256 / / 11.11.2005
Примерно так:
 
Код:
HWND GetMainWindow(HWND hwnd) {
    HWND result=NULL;
    HWND tmp=GetParent(hwnd);
    while (IsWindow(tmp)) {
        result = tmp;
        tmp = GetParent(result);
    };
    return result;
}
535
11 июня 2008 года
Нездешний
537 / / 17.01.2008
Цитата: GIZMO
На кнопке таскбара заголовок окна, т.е. кнопке->WM_GETTEXT потом FindWindow(по заголовку)
Только откуда ты хендл кнопки берешь?



С таскбара беру. Сначала нахожу видимые кнопки. Потом считываю с них текст. Затем по тексту ищу окна. И проверяю, есть ли у них Owner. Примерно так:

Код:
int iSize = 200;
char *szText = new char[iSize];
DWORD dwProcessID;
char **lp;

HWND hWndTaskbar = FindWindow("Shell_TrayWnd", NULL);
hWndTaskbar = FindWindowEx(hWndTaskbar, NULL, "ReBarWindow32", NULL);
hWndTaskbar = FindWindowEx(hWndTaskbar, NULL, "MSTaskSwWClass", NULL);
hWndTaskbar = FindWindowEx(hWndTaskbar, NULL, "ToolbarWindow32", NULL);

GetWindowThreadProcessId(hWndTaskbar, &dwProcessID);
HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessID);

lp = (LPSTR*)VirtualAllocEx(hProcess, NULL, iSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

int max = SendMessage(hWndTaskbar, TB_BUTTONCOUNT, 0, 0);

for(int i = 0; i < max; i++)
{
            if (SendMessage(hWndTaskbar, TB_ISBUTTONHIDDEN, i, 0))  continue;

            memset(szText, 0, iSize);
            SendMessage(hWndTaskbar, TB_GETBUTTONTEXT, i, (LPARAM)lp);
            ReadProcessMemory(hProcess, (LPVOID)lp, szText, iSize, 0);

            HWND hWndButton = FindWindow(NULL, szText);
            HWND hWndOwner = GetWindow(hWndButton, GW_OWNER);
            if(hWndOwner)  hWndButton = hWndOwner;
}

delete[] szText;
VirtualFreeEx(hProcess, lp, 0, MEM_RELEASE);
CloseHandle(hProcess);
}



С поиском по заголовку есть проблема: если открыто два окна с одинаковыми заголовками (например, программа ХХХ и папка, в которой она лежит, - тоже ХХХ), установить однозначное соответствие между кнопкой на таскбаре и окном не удается.

to max_dark: не срабатывает
246
11 июня 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Нездешний

С поиском по заголовку есть проблема: если открыто два окна с одинаковыми заголовками (например, программа ХХХ и папка, в которой она лежит, - тоже ХХХ), установить однозначное соответствие между кнопкой на таскбаре и окном не удается.


соответствие устанавливай через:
int GetClassName( HWND hWnd,
LPTSTR lpClassName,
int nMaxCount
);
у папки будет "CabinetWClass"

и если можно поясни цель (глобальную) зачем это нужно.

535
16 июня 2008 года
Нездешний
537 / / 17.01.2008
Цель:
Составить список запущенных приложений. По нажатию горячей клавиши скрыть/восстановить окна с рабочего стола, выбранные в списке, и их кнопки с панели задач.
А то заколебали со спины интересующиеся -- чем это я там занимаюсь! ;)
5.3K
16 июня 2008 года
Somebody
185 / / 24.12.2006
Список окон можно получить с помощью EnumWindows.
Цитата:

The EnumWindows function enumerates all top-level windows on the screen by passing the handle of each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.

535
16 июня 2008 года
Нездешний
537 / / 17.01.2008
Цитата: Somebody
Список окон можно получить с помощью EnumWindows.



В курсе. Знаешь, сколько их там? Как нужные отфильтровать? Опять же, останется проблемой найти соответствующую кнопку на панели задач

535
16 июня 2008 года
Нездешний
537 / / 17.01.2008
Цитата: GIZMO
Только откуда ты хендл кнопки берешь?



Как оказалось, хендл кнопки содержится в HIWORD поля dwData структуры TBBUTTON.
Так что теперь беру оттуда

14
23 июня 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Нездешний
Как нужные отфильтровать?



The Shell places a button on the taskbar whenever an application creates an unowned window—that is, a window that doesn't have a parent and that has the appropriate extended style bits.

Кнопкой на таксбаре соответствующей окну можно управлять через ITaskbarList

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог