|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Переместить "чужую" программу в трей
Всем привет!
Хотелось бы узнать как реализовать такое: Есть какая-то программа (например: Skype 4.2, Media Player Classic), нужно сделать так чтобы ее значок из панели задач перемещался в трей, но окно оставалось активным (так как это делает QIP). Смотрел вот ЭТУ статейку, но ничего подходящего не нашел Подскажите кто что знает!!! Последний раз редактировалось Danik007, 27.01.2010 в 00:29. |
#2
|
||||
|
||||
Неужели это не возможно?
Уважаемый форумчани помогите! Очень интересно как это реализовать!!! |
#3
|
|||
|
|||
Ну, что это возможно - это точно. Сам никогда не делал, но идея есть.
Ты должен: 1. Хукнуть окно программы 2. При его сворачивании установить ему невидимость (SW_HIDE, если ты что-нить понимаешь) 3. Вывесить иконку в трее (иконку взять у исполняемого модуля программы) 4. При клике на иконку восстановить видимость окна (SW_SHOW). Ну как-то так. |
#4
|
||||
|
||||
Алгоритм я знаю
Я получаю дескриптор окна, использую SW_HIDE и делаю все (почти все) как вы написали. Но у меня есть проблема, я не могу переместить в трей прикладную программу. Есть пара исходнико, но не знаю как в них добавить обращение к проге(получение дескриптора). Если у кого есть материалы по теме поделитесь пожалуйста. P.S. Что значить - "Хукнуть"? Последний раз редактировалось Danik007, 27.01.2010 в 00:30. |
#5
|
|||
|
|||
Ну получит хендл окна способов много. Ну к примеру используй Find Window. А хук ето перехватчик. Эт те надо в faq там найдеш ответ.
|
#6
|
||||
|
||||
Использую NOTIFYICONDATA, но не знаю как получить дескриптор иконки.
Вот пример структуры NOTIFYICONDATA: Код:
with TrayIconData do begin cbSize := SizeOf(TrayIconData); //размер иконки. ну тут и не надо что-то менять Wnd := FindWindow('Notepad', nil); // дескриптор окна, для примера взял блокнот uID := 0; uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; uCallbackMessage := WM_ICONTRAY; //понятия не имею что это. Если не сложно подскажите, на этом месте при компиляции ошибка. hIcon := ТУТ ДОЛЖЕН БЫТЬ ХЕНД ИКОНКИ :( ; StrPCopy(szTip, 'Свернутый в трей блокнот 0_о'); //текст для ToolTip'а end; Shell_NotifyIcon(NIM_ADD, @TrayIconData); Вот вроде и описал, пока хотелось бы разобраться хотябы с этим! Сам не справлюсь нужна помощь и я очень на нее надеюсь. Всем откликнувшимся спасибо!!! |
#7
|
||||
|
||||
В общем более-менее разобрался. Только я не знаю как сделать так, чтобы программа НЕ отображалась на панели задач, но отображалась на рабочем столе.
Это код добавления иконки блокнота в трей: Код:
procedure TForm1.Button1Click(Sender: TObject); begin HTD:=FindWindow('Notepad', nil); IC:=GetClassLong(HTD ,GCL_HICON); //Пытаемся достать with TrayIconData do begin cbSize := SizeOf(TrayIconData); Wnd := HTD; uID := 0; uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP; uCallbackMessage := WM_ICONTRAY; hIcon := IC; StrPCopy(szTip, 'In Tray'); end; Shell_NotifyIcon(NIM_ADD, @TrayIconData); end; Код:
begin ShowWindow(HTD, SW_HIDE); SetWindowLong(HTD, GWL_EXSTYLE, GetWindowLong(HTD, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); ShowWindow(HTD, SW_SHOW); end; Последний раз редактировалось Danik007, 28.01.2010 в 16:49. |
#8
|
|||
|
|||
Вообще-то ShowWindow(HTD, SW_HIDE); и ShowWindow(HTD, SW_SHOW); достаточно чтобы скрыть и показать окно.
|
#9
|
||||
|
||||
2 Ama
Спасибо, но я это знаю и хочу добиться другого результата нежели просто скрыть всю программу(и кнопку, и окно), я об этом писал в предыдущем сообщение: Цитата:
Есть еще варианты с использованием TB_HIDEBUTTON (TB_DELETEBUTTON)... Но я не знаю как этим воспользоваться Народ помогите, я уже отчаялся! |
#10
|
|||
|
|||
А если использовать setwindowlong(handle, gwl_exstyle, getwindowlong(handle, gwl_exstyle) or ws_ex_toolwindow) где-то так. Просто ща без компа
|
#11
|
||||
|
||||
2 Ama
Это у вас такие приколы? Посмотрите на сообщение №7 в этой теме! |
#12
|
|||
|
|||
Sorry недоглядел.
|