Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрыть кнопку с панели задач 
:(
    Опции темы
artsb
Дата 10.5.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Всем привет.

У меня в программе два окна. При запуске она сворачивается в трей. Мне не нужно, чтобы на панели задач отображалась кнопка приложения, даже если открыто одно из окон. Как вообще отключить эту кнопку? Пока сделал так: в обработчики OnShow форм написал:
Код

ShowWindow(Application->Handle,SW_HIDE);

Но может есть вариант получше?

С помощью горячих клавишь скрываю окно указанное пользователем:
Код

PHide->Checked=!PHide->Checked;
if(PHide->Checked) ShowWindow(window,SW_HIDE);
else ShowWindow(window,SW_SHOW);

здесь window - это HWND окна.
Но заметил, что не всегда скрывается кнопка приложения с панели задач. Как это исправить?

Также, при отображении окна, оно не становится активным, а остаётся под другими окнами. Что можно сделать, чтобы при отображении окно становилось активным и поверх других окон. Попробовал добавить строку:
Код

SetActiveWindow(window);

но не помогло.

Спасибо.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
THandle
Дата 10.5.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



1.
  
Код

 SetWindowLong(Application->Handle, GWL_EXSTYLE,
    GetWindowLong(Application->Handle, GWL_EXSTYLE) || WS_EX_TOOLWINDOW);


?

2. 

Код

SetForegroundWindow(Form1->Handle);



?
PM   Вверх
mrbrooks
Дата 10.5.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Имхо здесь посмотри. В данной теме мы с комрадом разбирали тему как раз работу с треем и скрытием формы.
 Грубо говоря у формы есть метод Hide() Возможно тебе его и хватит smile 
PM MAIL   Вверх
artsb
Дата 10.5.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



THandle, спасибо.
1. Это помогло только при открытии дочернего окна. Если открыть главную форму кнопка появляется.
2. Работает. Спасибо.


mrbrooks, спасибо. Посмотрю.

Добавлено через 3 минуты и 41 секунду
Сделал так:
Код

SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);


Вроде, всё работает.
Остаётся открытым  вопрос по поводу кнопки чужого приложения на панели задач.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
THandle
Дата 10.5.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



artsb, поставь на OnCreate.

Добавлено через 1 минуту и 38 секунд
вот сам пример из FAQ, только на Delphi:

http://forum.vingrad.ru/faq/topic-183849.html
PM   Вверх
artsb
Дата 10.5.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Так я там и ставил. Но уже этот вопрос решён. Спасибо.
Остаётся только кнопка чужого приложения.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 10.5.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Попробовал так:
Код

ShowWindow(FindWindowEx(FindWindow("Shell_TrayWnd",NULL),NULL,"Button",Edit2->Text.c_str()),SW_HIDE);
ShowWindow(FindWindowEx(FindWindow("Shell_TrayWnd",NULL),NULL,"Button",Edit2->Text.c_str()),SW_SHOW);

Не работает.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 10.5.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Интерфейс ITaskbarList должен помочь: http://msdn.microsoft.com/en-us/library/bb774652(VS.85).aspx
PM   Вверх
artsb
Дата 10.5.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586, спасибо. Но я не понял как с ним работать. Можно примерчик. Спасибо.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 10.5.2008, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



PM   Вверх
artsb
Дата 11.5.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586, спасибо. Почитал. Интересно...
Там VladD2 пишет:
Код

HWND hWnd = ::FindWindow(_T("Notepad"), NULL);
if(!hWnd)
    return;
// Если окно уже имеет парента...
if(::GetWindowLong(hWnd, GWL_HWNDPARENT))
    // урать его, тем самым показав в таскбаре...
    ::SetWindowLong(hWnd, GWL_HWNDPARENT, NULL);
else
    // иначе ставим его парантом к DesktopWindow, тем самым убирая из таскбара.
    ::SetWindowLong(hWnd, GWL_HWNDPARENT, (LONG)::GetDesktopWindow());

А как получить хэндл кнопки? Так пойдёт:
Код

HWND hWnd = FindWindowEx(FindWindow("Shell_TrayWnd",NULL),NULL,"Button",Edit2->Text.c_str());
if(!hWnd)
    return;
// Если окно уже имеет парента...
if(GetWindowLong(hWnd, GWL_HWNDPARENT))
    // урать его, тем самым показав в таскбаре...
    SetWindowLong(hWnd, GWL_HWNDPARENT, NULL);
else
    // иначе ставим его парантом к DesktopWindow, тем самым убирая из таскбара.
    SetWindowLong(hWnd, GWL_HWNDPARENT, (LONG)GetDesktopWindow());



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 11.5.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(artsb @  11.5.2008,  15:57 Найти цитируемый пост)
спасибо. Почитал. Интересно...

Там пример внизу есть, тот что ты просил. С интерфейсом ITaskbarList.
Код
#include <ShlObj.h>

   CoInitialize(NULL);
   ITaskbarList *pTaskBar = 0;
   HRESULT hr = CoCreateInstance(CLSID_TaskbarList, 0,
                                 CLSCTX_ALL, IID_ITaskbarList, (void**)&pTaskBar);
   if(SUCCEEDED(hr))
   {
        pTaskBar->DeleteTab(hWnd);
        pTaskBar->Release();
   }     
   CoUninitialize();

PM   Вверх
artsb
Дата 11.5.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Не совсем понял, где здесь указывать кнопку, которую я хочу скрыть? :(

Добавлено через 3 минуты и 28 секунд
Код

pTaskBar->DeleteTab(/* ---> */hWnd/* <--- */);  // оно?



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 11.5.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Попробовал так:
Код

void __fastcall TfMain::PHideClick(TObject *Sender)
{
PHide->Checked=!PHide->Checked;
if(PHide->Checked)
{
ShowWindow(window,SW_HIDE);
if(button)
{
   CoInitialize(NULL);
   ITaskbarList *pTaskBar = 0;
   HRESULT hr = CoCreateInstance(CLSID_TaskbarList, 0,
                                 CLSCTX_ALL, IID_ITaskbarList, (void**)&pTaskBar);
   if(SUCCEEDED(hr))
   {
        pTaskBar->DeleteTab(button);
        pTaskBar->Release();
   }
   CoUninitialize();
}
}
else
{
ShowWindow(window,SW_SHOW);
SetForegroundWindow(window);
if(button)
{
   CoInitialize(NULL);
   ITaskbarList *pTaskBar = 0;
   HRESULT hr = CoCreateInstance(CLSID_TaskbarList, 0,
                                 CLSCTX_ALL, IID_ITaskbarList, (void**)&pTaskBar);
   if(SUCCEEDED(hr))
   {
        pTaskBar->AddTab(button);
        pTaskBar->Release();
   }
   CoUninitialize();
}
}
}

кнопку ищу так:
Код

button=FindWindowEx(FindWindow("Shell_TrayWnd",NULL),NULL,"Button",Edit2->Text.c_str());

При компиляции пишет:
  [C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
  [C++ Error] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'
  [C++ Error] ShlObj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO'
  [C++ Error] ShlObj.h(3457): E2238 Multiple declaration for 'SHELLFLAGSTATE'
Как с этим бороться?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 11.5.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



В начале кода напиши:
Код
#define NO_WIN32_LEAN_AND_MEAN

hWnd - это хендл окна, а не кнопки smile

Это сообщение отредактировал(а) 586 - 11.5.2008, 15:50
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.