Как, зная HWND кнопки на TaskBar, найти HWND соответствующего окна приложения?
На кнопке таскбара заголовок окна, т.е. кнопке->WM_GETTEXT потом FindWindow(по заголовку)
Только откуда ты хендл кнопки берешь?
HWND result=NULL;
HWND tmp=GetParent(hwnd);
while (IsWindow(tmp)) {
result = tmp;
tmp = GetParent(result);
};
return result;
}
Только откуда ты хендл кнопки берешь?
С таскбара беру. Сначала нахожу видимые кнопки. Потом считываю с них текст. Затем по тексту ищу окна. И проверяю, есть ли у них Owner. Примерно так:
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: не срабатывает
С поиском по заголовку есть проблема: если открыто два окна с одинаковыми заголовками (например, программа ХХХ и папка, в которой она лежит, - тоже ХХХ), установить однозначное соответствие между кнопкой на таскбаре и окном не удается.
соответствие устанавливай через:
int GetClassName( HWND hWnd,
LPTSTR lpClassName,
int nMaxCount
);
у папки будет "CabinetWClass"
и если можно поясни цель (глобальную) зачем это нужно.
Составить список запущенных приложений. По нажатию горячей клавиши скрыть/восстановить окна с рабочего стола, выбранные в списке, и их кнопки с панели задач.
А то заколебали со спины интересующиеся -- чем это я там занимаюсь! ;)
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.
В курсе. Знаешь, сколько их там? Как нужные отфильтровать? Опять же, останется проблемой найти соответствующую кнопку на панели задач
Как оказалось, хендл кнопки содержится в HIWORD поля dwData структуры TBBUTTON.
Так что теперь беру оттуда
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