Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как скрыть программу из списка который появляется по нажатию Alt+Tab

29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Поисковики выдают в основном ссылки на форумы по Delphi :(
Попробовал написать так (по аналогии с Delphi)

 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
   Style = WS_EX_TOOLWINDOW;
   SetWindowLong(Application->Handle, GWL_EXSTYLE, Style);


На панели задач программа пропала, но по Alt+Tab ее все равно видно...
Помогите, добрые люди :)
12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
Все должно получиться, только две первые строчки совсем не надо, можно написать так:
SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

Пробовалось, правда на диалоговом приложении написанном под VC6.
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: __AleXX__
Все должно получиться, только две первые строчки совсем не надо, можно написать так:
SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

Пробовалось, правда на диалоговом приложении написанном под VC6.



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

29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Не помогает даже
[INDENT]
 
Код:
SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW & !WS_EX_APPWINDOW);
[/INDENT]
12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
Я не уверен что предложенная конструкция должна работать правильно, т.к.
!WS_EX_APPWINDOW = 0, скорее всего, т.е. преобразовано к булевому значению.

и толку от этого .... никакого, только вред
590
08 августа 2007 года
Gigahard
223 / / 03.04.2006
Вообще то, стилевое оформление является битовой маской. По этому при смене стиля какого то элемента, нужно не заменять эту битовую маску, а накладывать ее на уже существующий стиль, чтобы не изменить другие свойства.

Т.е. в данном случае, нужно писать не
 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
   Style = WS_EX_TOOLWINDOW;


а
 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
   Style |= WS_EX_TOOLWINDOW;
12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
+1
просто как то пропустил, акцент поставил на другом.
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: __AleXX__
Я не уверен что предложенная конструкция должна работать правильно, т.к.
!WS_EX_APPWINDOW = 0, скорее всего, т.е. преобразовано к булевому значению.

и толку от этого .... никакого, только вред



я нашел тут и сделал по аналогии

Код:
program Project1;
uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
var
 ExtendedStyle : integer;
begin
  Application.Initialize;
  ExtendedStyle:=GetWindowLong(application.Handle, GWL_EXSTYLE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    ExtendedStyle or WS_EX_TOOLWINDOW {AND NOT WS_EX_APPWINDOW});
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


что толку нет, я понял...

Но вопрос остается открытым...
17K
08 августа 2007 года
vagran
25 / / 11.11.2006
! - оператор булева отрицания, ~ - побитовый опереатор инверсии, не надо путать. Попробуй так:
 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
Style =| WS_EX_TOOLWINDOW;
Style &= ~WS_EX_APPWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, Style);
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: Gigahard
Вообще то, стилевое оформление является битовой маской. По этому при смене стиля какого то элемента, нужно не заменять эту битовую маску, а накладывать ее на уже существующий стиль, чтобы не изменить другие свойства.

Т.е. в данном случае, нужно писать не
 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
   Style = WS_EX_TOOLWINDOW;


а
 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
   Style |= WS_EX_TOOLWINDOW;



Так тоже попробовал. Толку нет. Может дело не в коде, а в настройках компилятора? Компилирую в Borland C++Builder 6, специально ничего не настраивал...

29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: vagran
! - оператор булева отрицания, ~ - побитовый опереатор инверсии, не надо путать. Попробуй так:
 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
Style =| WS_EX_TOOLWINDOW;
Style &= ~WS_EX_APPWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, Style);



Тоже не работает...

12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
а попробуй так:

 
Код:
DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
Style |= WS_EX_TOOLWINDOW;
Style ^= WS_EX_APPWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, Style);


Строкой Style ^= WS_EX_APPWINDOW;
мы правильно исключаем стиль WS_EX_APPWINDOW из набора
17K
08 августа 2007 года
vagran
25 / / 11.11.2006
а мой вариант попробовал? Должен работать
12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
vagran +1,
работает,
но моя запись короче :))
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
vagran, __AleXX__, пробовал оба варианта. не помогает
12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
исходник или покажи или скинь как-то,
а то мож. у тебя проблем не совсем в этом :)
17K
08 августа 2007 года
vagran
25 / / 11.11.2006
Странно, у меня работает. Может быть мешают другие аттрибуты стиля, или вообще у твоего окна есть родительское, и надо его стиль менять. Попробуй прогу InqSoft Window Scanner и всё сразу станет ясно, кто кому папа, сестра и бабушка :) (и с какм стилем)
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: __AleXX__
исходник или покажи или скинь как-то,
а то мож. у тебя проблем не совсем в этом :)



Я уже предположил про проблемы в другом месте, но куда копать не знаю...

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("ncmf.cpp", MainForm);
USEFORM("ncsf.cpp", SettingsForm);
USEFORM("ncaf.cpp", AboutForm);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   HANDLE hFile = CreateFile("nclockisrun.tmp",
      GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL);
   if(hFile == INVALID_HANDLE_VALUE)
      return 1;

   DWORD Style = GetWindowLong(Application->Handle, GWL_EXSTYLE);
   Style |= WS_EX_TOOLWINDOW;
   Style ^= WS_EX_APPWINDOW;
   SetWindowLong(Application->Handle, GWL_EXSTYLE, Style);

   try
   {
      Application->Initialize();
      Application->Title = "nuclear clock";
      Application->CreateForm(__classid(TMainForm), &MainForm);
                 Application->CreateForm(__classid(TSettingsForm), &SettingsForm);
                 Application->CreateForm(__classid(TAboutForm), &AboutForm);
                 Application->Run();
   }
   catch (Exception &exception)
   {
      Application->ShowException(&exception);
   }
   catch (...)
   {
      try
      {
         throw Exception("");
      }
      catch (Exception &exception)
      {
         Application->ShowException(&exception);
      }
   }
   return 0;
}
//---------------------------------------------------------------------------
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
тут можно взять целиком проект
17K
08 августа 2007 года
vagran
25 / / 11.11.2006
У меня практически нет опыта в программировании со всякими стандартными классами (использую только чистое API), поэтому могу ошибаться: может быть стиль надо менять только после Application->Initialize()?
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: vagran
Странно, у меня работает. Может быть мешают другие аттрибуты стиля, или вообще у твоего окна есть родительское, и надо его стиль менять. Попробуй прогу InqSoft Window Scanner и всё сразу станет ясно, кто кому папа, сестра и бабушка :) (и с какм стилем)



Благодарю за программу! Найду и обязательно попробую

12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
Ты не там вроде пишешь, пытаешься задать стили для аппликиции, которая еще даже не проинициализирована -> хендл скорее всего не валидный.

Надо где-то в др. месте, в функции инициализации формы например
29K
08 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: vagran
У меня практически нет опыта в программировании со всякими стандартными классами (использую только чистое API), поэтому могу ошибаться: может быть стиль надо менять только после Application->Initialize()?



Кстати, а какую умную книгу (кроме MSDN) можно почитать про программирование исключительно на API? :)

А после Application->Initialize() я тоже пробовал и не помогло :)

17K
08 августа 2007 года
vagran
25 / / 11.11.2006
Цитата:
Кстати, а какую умную книгу (кроме MSDN) можно почитать про программирование исключительно на API?


Даже не знаю, я когда-то давно учился так: взял исходник программы "Hello world" и по хелпу Borland C++, искал, что делает каждая функция. Потом просто почитал оттуда же файл win32.hlp по главам. Одновременно с этим и C постигал. А первый мой язык был ассемблер на Spectrum, вот и не захватил я как-то MFC и прочие, облегчающие жизнь программиста, примочки :)

12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
Я думаю надо поробовать в форме MainForm в конструкторе попробовать, если не получится, то по наж. какой-то кнопки.

Почему так, да потому что до вызова метода Run(), я как понимаю на самом деле диаложек не отобразиться, че там делают функции CreateForm не знаю, а билдеровской справки под рукой нет.

Самый верный выход: как я говорил, создать на главном диаложке кнопочку и по нажатию на неё попробовать поменять стили.

Дома попробую :))
12K
08 августа 2007 года
__AleXX__
133 / / 02.04.2007
Цитата: __AleXX__
Я думаю надо поробовать в форме MainForm в конструкторе попробовать, если не получится, то по наж. какой-то кнопки.

Почему так, да потому что до вызова метода Run(), я как понимаю на самом деле диаложек не отобразиться, че там делают функции CreateForm не знаю, а билдеровской справки под рукой нет.

Самый верный выход: как я говорил, создать на главном диаложке кнопочку и по нажатию на неё попробовать поменять стили.

Дома попробую :))





Ураа! Короче, вроде решил проблему.
Надо сделать так:

1. В свойствах формы свойство BorderStyle установить в значение bsToolWindow.

2. В том файлике кот. ты показывал дописать перед вызовом: Application->Run();
такие строчки:

 
Код:
DWORD style = GetWindowLong(Application->Handle,GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(Application->Handle,GWL_EXSTYLE,style);


У меня это достаточным.

P.S. Почемуто без п.1 ничего не получалось.

ИМХО лучше программить с помощью VisualStudio.
29K
09 августа 2007 года
professor-cos
14 / / 08.08.2007
Цитата: __AleXX__
Ураа! Короче, вроде решил проблему.
Надо сделать так:

1. В свойствах формы свойство BorderStyle установить в значение bsToolWindow.

2. В том файлике кот. ты показывал дописать перед вызовом: Application->Run();
такие строчки:

 
Код:
DWORD style = GetWindowLong(Application->Handle,GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(Application->Handle,GWL_EXSTYLE,style);


У меня это достаточным.

P.S. Почемуто без п.1 ничего не получалось.

ИМХО лучше программить с помощью VisualStudio.



Так. Ясно. Тоже получилось. Спасибо! Но возникает другая проблема. Мне BorderStyle нужен bsNone, т.к. в любом другом случае у меня у окна есть заголовок, который мне не нужен

92
09 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
и наверное стиль нужно накладывать на главное окно приложения.... а не на Handle приложения ) если не обшибаюсь... ну и делать это после создания окна...

или ошибся? :rolleyes:

ЗЫ: никада так не баловался )
12K
09 августа 2007 года
__AleXX__
133 / / 02.04.2007
Блин, действительно как-то упустил :)

Но самое интересное, что если на хендл стиль не наложить ни фига не выходило :)) (в моём последнем варианте)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог