Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Список окон.

Добрый день.
Как можно получить список окон, которые отображаются на таскбаре.
Список процессов получить могу, но как из них выделить нужные не знаю.
Пробовал сделать EnumChildWindows у таскбара, но такой фокус не
прошел.
Попутные вопросы, можно ли зная HWND окна узнать его класс и получить
иконку этого окна.
Всем заранее спасибо.

Номер выпуска : 4922
Возраст листа : 731 (дней)
Количество подписчиков : 536
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/441288
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Wed, 21 Sep 2005 11:58:56 +0300 (#441288)

 

Ответы:

На основной вопрос точного ответа не дам, но ИМХО одно из двух: либо
кнопки ни фига не отдельные окна, либо "дочерность" у них вложенная.
На попутные вопросы: имя класса окна получается фунцией GetClassName(),
сопутствующие функции GetClassInfo() и GetClassInfoEx(). Оттуда же и иконку
можно получить.

--
С уважением, boroda

Номер выпуска : 4923
Возраст листа : 732 (дней)
Количество подписчиков : 536
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/441471
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Thu, 22 Sep 2005 10:15:23 +0400 (#441471)

 

Добрый день,

Шматко> На основной вопрос точного ответа не дам, но ИМХО одно из двух: либо
Шматко> кнопки ни фига не отдельные окна, либо "дочерность" у них вложенная.

Похоже, что дочерей у таскбара вообще нет, кнопок тоже. Получается,
что вопрос в том, какими элементами таскбар делает отображение окон.
Может есть у кого какие идеи?

Шматко> На попутные вопросы: имя класса окна получается фунцией GetClassName(),
Шматко> сопутствующие функции GetClassInfo() и GetClassInfoEx(). Оттуда же и
иконку
Шматко> можно получить.

Спасибо большое. Вроде еще GetClassLong помочь может.

Ответить   Thu, 22 Sep 2005 12:01:54 +0300 (#441784)

 

Здравствуйте !

Почему же нет ?
Кнопка "пуск" - дочернее окно таскбара.
Рядом с "пуск" лежат трей и ребар (окно класса ReBarWindow32).
На ReBar-е находятся панельки. Каждая панель может представлять
что угодно. Можно написать свой Desk Band для таскбара и будет
там Ваша панелька. Так вот, конкретно панелька, на которой
располагаются кнопки с именами приложений - обычный тулбар.
Все это для XP.

В 95-х виндах никаких панелек, вроде, не было. Что там за контрол
торчит в таскбаре точно не скажу. Может, тот же тулбар,
может - Tab Control (просто меня терзают смутные воспоминания, что
я как то смотрел это дело в 95-х виндах и там был не тулбар).

Ответить   Thu, 22 Sep 2005 21:36:56 +0400 (#441801)

 

Hello Алексей,

Wednesday, September 21, 2005, 12:58:56 PM, you wrote:

GetDesktopWindow(), GetWindow(hwnd, GW_CHILD);
более подробно http://www.firststeps.ru/ раздел VisualC/WinAPI/шаг 1

Ответить   Thu, 22 Sep 2005 18:16:30 +0400 (#441698)

 

Хаю ду ю ду Алексей?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

Сразу скажу - не знаю, не пробовал, но попробую натолкнуть - в Delphi
ShowWindow(Form.Handle, SW_HIDE); скрывает окно,
а ShowWindow(Application.Handle, SW_HIDE); - кнопку на таскбаре, т.е.
если главное окно программы не скрыто - значит кнопка должна быть, но
я вот не помню точно - нет ли како-го нибудь стиля окна что-бы оно
было не скрытым, а кнопки не было. И еще - для дочерних окон тоже
можно добавлять кнопки:
SetWindowLong(Handle, GWL_EXSTYLE,GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);

Ответить   Thu, 22 Sep 2005 21:52:59 +0500 (#441743)

 

Это только предположение, но...
Если FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, 'Button', nil)
возвращает хэндл кнопки "Пуск", то вызывая эту же функцию со вторым
параметром бОльшим, чем 0, можно получить хэндл соответствующей кнопки
на таскбаре - я так это понимаю. Ему можно послать сообщение
TB_PRESSBUTTON с параметром TRUE для имитации "задавливания" кнопки.
Теперь остается вызвать GetForegroundWindow для получения хэндла
соответствующего окна. Хотя бывают ситуации, конечно, когда при щелчке
на кнопке таскбара окно н выходит на передний план.

Ответить   Шешунов Вадим Fri, 23 Sep 2005 12:05:52 +0300 (#442264)

 

Здравствуйте, Алексей!

На панели задач отображаются окна, которые:
- являются видимыми
- не имеют родительского окна

Я тут покопался в исходниках taskmgr.exe, нашел вот что:

1. Отбрасывание ненужных окон в EnumWindowsProc:
if ((GetWindow(hwnd, GW_OWNER)) ||
(!IsWindowVisible(hwnd)))
{
//
// not a top level window, or not visible
//

return TRUE;
}
2. Получение иконки окна:
// Icons

#define ICON_FETCH_TIMEOUT 100

if (!fUpdateOnly)
{
m_hSmallIcon = NULL;
m_hLargeIcon = NULL;

if (!SendMessageTimeout(hwnd, WM_GETICON, 0, 0,
SMTO_BLOCK | SMTO_ABORTIFHUNG,
ICON_FETCH_TIMEOUT, (PULONG_PTR) &m_hSmallIcon)
|| NULL == m_hSmallIcon)
{
m_hSmallIcon = (HICON) GetClassLongPtr(hwnd, GCLP_HICONSM);
}
if (!SendMessageTimeout(hwnd, WM_GETICON, 1, 0,
SMTO_BLOCK | SMTO_ABORTIFHUNG,
ICON_FETCH_TIMEOUT, (PULONG_PTR) &m_hLargeIcon)
|| NULL == m_hLargeIcon)
{
m_hLargeIcon = (HICON) GetClassLongPtr(hwnd, GCLP_HICON);
}
}
С уважением, AleX

Номер выпуска : 4935
Возраст листа : 736 (дней)
Количество подписчиков : 535
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/443372
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 25 Sep 2005 22:59:29 +0400 (#443372)

 

Что-то много здесь было мудреных ответов. Возможно,
я чего-то не понимаю, но решение проще.

Смотрим раздел MSDN "Handling the Taskbar", подраздел
"Visibility of Taskbar Buttons" (или вроде того).
Там сказано, что на панели задач отображаются кнопки
для видимых окон без владельца, которые к тому же
не имеют стиля WS_EX_TOOLWINDOW.
Получается простой перебор:

BOOL CALLBACK EnumProc(HWND hwnd,LPARAM lParam) {
TCHAR szTitle[256];

if(IsWindowVisible(hwnd)&&(GetWindow(hwnd,GW_OWNER)==0)&&
((GetWindowLong(hwnd,GWL_EXSTYLE)&WS_EX_TOOLWINDOW)==0)) {
GetWindowText(hwnd,szTitle,sizeof(szTitle));
printf("%s\n",szTitle);
}
return TRUE;
}
int main(void) {
EnumWindows(EnumProc,0);
return 0;
}

Затем при желании можно узнать идентификатор процесса,
которому принадлежит окно с помощью
GetWindowThreadProcessId.

Номер выпуска : 4942
Возраст листа : 739 (дней)
Количество подписчиков : 533
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/445595
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Thu, 29 Sep 2005 10:57:19 +0400 (#445595)

 

Всем огромное спасибо, вопрос закрыт.

Есть другая проблема теперь. Получаю кнопку с помощью месседжа
TB_GETBUTTON. У полученной структуры есть поле iString, которое
указывает на адрес, где хранится строка. Я считываю эту строку и вижу
там такое: если текст английский, то через один символ стоит #0, если
же текст русский то кракозябры всякие, я думаю что используются
двухбайтные символы. Кто-нибудь знает как получить обычный string?
Пишу на Делфи.

Номер выпуска : 4943
Возраст листа : 739 (дней)
Количество подписчиков : 533
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/445731
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Thu, 29 Sep 2005 13:46:20 +0300 (#445731)

 

Хаю ду ю ду Алексей?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

Праильно думаешь

Юзай widestring вместо string.

Ответить   Thu, 29 Sep 2005 20:47:06 +0500 (#445875)

 

Добрый день Александр,

Thursday, September 29, 2005, 6:47:06 PM, вы писали:

Александр> Хаю ду ю ду Алексей?

Александр> Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
Александр> тоже что-нибудь напечатаю:

Александр> Праильно думаешь

Александр> Юзай widestring вместо string.

Когда я использовал вместо buf: array [0..N] of char такое
buf: array [0..N] of widechar и дальнейшим переводом в widestring, то получалась
фигня одна.
Я не знаю как из buf: array [0..N] of char получить Widestring.
Был бы очень признателен.

Ответить   Fri, 30 Sep 2005 12:50:37 +0300 (#446276)

 

Хаю ду ю ду Алексей?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

Александр>> Юзай widestring вместо string.

Попробуй array of widechar + SetLength, т.к. array [0..N] of char
автоматом переводиться компиллятором в PChar, насчет
array [0..N] of widechar, не знаю.

из ansi ты вряд-ли wide получишь

Ты приведи кусок своего кода - будет хоть что исправлять.

Ответить   Fri, 30 Sep 2005 17:43:10 +0500 (#446508)

 

Здравствуйте !

Наверно, надо посмотреть, юникодный ли текст при помощи IsTextUnicode
если да, то можно конвертировать в ascii при помощи WideCharToMultiByte.

Ответить   Fri, 30 Sep 2005 21:52:44 +0400 (#446609)