Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запрет на сворачивание


Автор: MihaAntr 4.8.2006, 10:48
У меня есть приложение(оболочка)...При его запуске рабочий стол скрывает и запрещается диспетчер задач. остается одна панель задач без "пуска"...
Но при нажати Виндовс+Д(показать рабочий) прога сворачивается.Как сделать так,чтобы она весела постоянно и не сварачивалась? Но, чтобы не было на переднем плане постоянно, просто как-бы исела в фоне? Я извиняюсь, если такая тема уже была, но я не нашел. Прошу помочь. Заранее блогадарен!

Автор: Alexeis 4.8.2006, 10:59
http://forum.vingrad.ru/index.php?act=module&module=vingradfaq

Автор: _hunter 4.8.2006, 11:04
странно как ты искал...
http://forum.vingrad.ru/index.php?showtopic=31971

Автор: Snowy 4.8.2006, 11:06
Внизу страницы линки посмотри. Например этот: http://forum.vingrad.ru/index.php?showtopic=31971&view=findpost&p=237314

Автор: Alexeis 4.8.2006, 12:20
Пол
Цитата(MihaAntr @  4.8.2006,  10:48 Найти цитируемый пост)
Но при нажати Виндовс+Д(показать рабочий) прога сворачивается.Как сделать так,чтобы она весела постоянно и не сварачивалась?

Ну Виндовс+Д и ALT + TAB, перехватывается хуком без проблем, после этого если отправить сообщение о восстановлении окна, то окно не успевает даже свернутся.
 А как побороть тоже действие произведенной со специального ярлыка? Там вроде вызывается iExplorer, c командной строкой к спец ярлыку. Как бы узнать по точнее эти параметры?

Автор: bems 4.8.2006, 13:47
прошу прощения, а проигнорировать WM_SYSCOMMAND если wParam=SC_MINIMIZE не помогает?

Автор: Alexeis 4.8.2006, 14:04
Цитата(bems @  4.8.2006,  13:47 Найти цитируемый пост)
 проигнорировать WM_SYSCOMMAND если wParam=SC_MINIMIZE не помогает?

В том то и прикол что не шлется ничего проге, в этом случае. (Событие OnMinimize) не происходит.

Автор: bems 4.8.2006, 14:18
на мое окно команда "показать рабочий стол" не влияет, и я для этого ничего не делал. Окно у меня WS_EX_TOPMOST or WS_EX_LAYERED or WS_EX_TOOLWINDOW

Автор: Alexeis 4.8.2006, 15:18
Да и впровду 
Вот такое не прячется
Код

program winmin;
 
uses
  windows,
  messages;

{$R *.res}  

var
  wc      : TWndClassEx;
  MainWnd : HWnd;
  Mesg    : TMsg;

 
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam;
                    Lparam:Lparam):Lresult; stdcall;
Begin
  case msg
  of
    wm_destroy :
    Begin
      postquitmessage(0);
      Result:=0;
      exit;
    End
    else
      Result:=DefWindowProc(wnd,msg,wparam,lparam);
  end;
End;

var
  xPos,yPos,nWidth,nHeight : Integer;

begin
  wc.cbSize        :=  sizeof(wc);
  wc.style         :=  cs_hredraw or cs_vredraw;
  wc.lpfnWndProc   :=  @WindowProc;
  wc.cbClsExtra    :=  0;
  wc.cbWndExtra    :=  0;
  wc.hInstance     :=  HInstance;
  wc.hIcon         :=  LoadIcon  (0, idi_application);
  wc.hCursor       :=  LoadCursor(0, idc_arrow);
  wc.hbrBackground :=  COLOR_BTNFACE + 1;
  wc.lpszMenuName  :=  nil;
  wc.lpszClassName :=  'WinMin : Main';
 
  RegisterClassEx(wc);
  xPos    :=100;
  yPos    :=150;
  nWidth  :=400;
  nHeight :=250;
 
  MainWnd:=CreateWindowEx(
            WS_EX_TOPMOST
            or WS_EX_TOOLWINDOW,
            'WinMin : Main',
            'Win Min',
            ws_overlappedwindow,
            xPos,
            yPos,
            nWidth,
            nHeight,
            0,
            0,
            Hinstance,
            nil
            );

  ShowWindow(MainWnd, CmdShow);

  While GetMessage(Mesg,0,0,0)
  do
    begin
      TranslateMessage(Mesg);
      DispatchMessage(Mesg);
    end;
end.


Но попытка установить такое для обычной формы
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  wstyle : Cardinal;
begin
 wstyle := GetWindowLong(form1.Handle, GWL_EXSTYLE);
 wstyle := wstyle or WS_EX_TOPMOST or WS_EX_TOOLWINDOW;
 SetWindowLong(form1.Handle, GWL_EXSTYLE, wstyle);
end;


ни к чему хорошему не приводит smile 

Автор: bems 4.8.2006, 17:16
Цитата(alexeis1 @  4.8.2006,  15:18 Найти цитируемый пост)
Но попытка установить такое для обычной формы ни к чему хорошему не приводит   
 Может с Application.handle это сделать?

Автор: Alexeis 4.8.2006, 17:35
Цитата(bems @  4.8.2006,  17:16 Найти цитируемый пост)
Может с Application.handle это сделать?

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

Автор: Romikgy 4.8.2006, 21:34
Цитата(alexeis1 @  4.8.2006,  14:18 Найти цитируемый пост)
ни к чему хорошему не приводит

дык его наверное пересоздать надобно smile

Автор: Alexeis 4.8.2006, 21:42
Цитата(Romikgy @  4.8.2006,  21:34 Найти цитируемый пост)
дык его наверное пересоздать надобно 

Так при пересоздании оно создастся с ранее установленными параметрами (записанными в объекте) и настройки пропадают вообще. Это надо получить доступ к настройкам стиля окна и туда записать параметры. Только тогда пересозданное окно создастсмя с новыми значениями.

Автор: Демо 5.8.2006, 00:05
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure Idle(Sender: TObject; var Done: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := Idle;
end;

procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
begin
  if isIconic(Application.Handle) then Application.Restore;
end;

end.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)