Скрыть окно из таскбара. Как?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Доброго всем времени суток,
В связи с тем, что начиная с ревизии от

2005-03-26 11:24 micha r7029

  /trunk/lcl/:
    forms.pp
    include/: application.inc

  remove TApplication.Handle (not cross-platform)


Стало невозможно скрыть окно из таскбара, при помощи ShowWindow(Application.Handle, SW_HIDE);

Мне известно, что можно осуществить это, если указать в качестве предка, невидимое окно... но мне этод метод кажется кривоватым.

Существующее у формы свойство ShowInTaskBar - вообще для win32 не реализован похоже.

Пока роюсь в англоязычных форумах, но безуспешно...
IUnknown
новенький
Сообщения: 73
Зарегистрирован: 10.03.2006 13:25:02
Откуда: Донецк

Сообщение IUnknown »

В любом случае Handle это как я понимаю тоже что HWND. Тогда можно поступить так

Код: Выделить всё

hwnd : =FindWindow(nil,'MyWindowName');
if hwnd <> 0 then
ShowWindow(hwnd, SW_HIDE);
Гость_SovNarKom

Сообщение Гость_SovNarKom »

IUnknown
Это аналог Visible у TForm, этот код скроет именно окно, но из таскбара его не уберёт, а мне нужно наоборот
IUnknown
новенький
Сообщения: 73
Зарегистрирован: 10.03.2006 13:25:02
Откуда: Донецк

Сообщение IUnknown »

Тогда стоит копать в направлении стиля окна. Окошко на таскбаре не будет видно если у него установлен расширенный стиль WS_EX_TOOLWINDOW.
Примерно что-то такое

Код: Выделить всё

SetWindowLong( Handle, GetWindowLong (Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW)
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

IUnknown
Не, я вчера уже пробовал... прокатывает, если более одного окна и все надо скрыть(но одна кнопа всё равно остаётся).

Промежуточное решение такое(найдено методом сканирования окон в процессе):

Код: Выделить всё

 showwindow(findwindow('window',<'projectname'>), sw_hide);

Но мне оно не очень нравится... надо просто найти, где создаётся окно с классом 'window' и именем программы.


Во!

Код: Выделить всё

win32object.inc
...
procedure TWin32WidgetSet.AppInit(var ScreenInfo: TScreenInfo);
...
// Create parent of all windows, `button on taskbar'
  FAppHandle := CreateWindow(@ClsName, PCha...
...


Теперь нужно только докопаться до FAppHandle
IUnknown
новенький
Сообщения: 73
Зарегистрирован: 10.03.2006 13:25:02
Откуда: Донецк

Сообщение IUnknown »

Можно еще попробовать Shell_NotifyIcon, с первым параметром NIM_DELETE
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Вот, нашол наконец-то.

Код: Выделить всё

uses
 Win32Int, InterfaceBase;
 
 ShowWindow(TWin32WidgetSet(WidgetSet).AppHandle, SW_HIDE);


Shell_NotifyIcon не пробовал, но где-то плохое о нём читал...
да и что ему передавать?
IUnknown
новенький
Сообщения: 73
Зарегистрирован: 10.03.2006 13:25:02
Откуда: Донецк

Сообщение IUnknown »

Да вот для альтернативы пример из МСДН

Код: Выделить всё

BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) 
{
    BOOL res;
    NOTIFYICONDATA tnid;
 
    tnid.cbSize = sizeof(NOTIFYICONDATA);
    tnid.hWnd = hwnd;
    tnid.uID = uID;
        
    res = Shell_NotifyIcon(NIM_DELETE, &tnid);
    return res;
}
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Да вот для альтернативы пример из МСДН

Это для удаления иконки "у часиков".
IUnknown
новенький
Сообщения: 73
Зарегистрирован: 10.03.2006 13:25:02
Откуда: Донецк

Сообщение IUnknown »

Это для удаления иконки "у часиков".


Ага, но все равно вся эта область есть Taskbar. На WinApi нету "красивого" способа убрать оттуда кнопку. Так что если в Лазаре уже реализована такая возможность - это безусловно зачет :)
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Частично пофиксено кажется.

<a href='http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=2194' target='_blank'>http://www.lazarus.freepascal.org/index.ph...iewtopic&t=2194</a>
Ответить