Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.10.2011, 09:54
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
Восклицание Свернуть в трэй при загрузке

Подскажите как сделать чтоб при загрузке Windows моя программка была запущенна в свёрнутом режиме вычитал что можно в OnCreate главной формы поместить
PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 1);
но ка кто криво всё работает после развёртывания форма перестаёт быть во весь экран

[IMG] [/IMG]

Последний раз редактировалось Gudzik11, 09.10.2011 в 10:14.
Ответить с цитированием
  #2  
Старый 09.10.2011, 11:50
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Какая Delphi? вариант еще:
Код:
PostMessage(Application.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
хотя на Delphi 7 и
Код:
PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
нормально работает.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 09.10.2011, 14:37
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
По умолчанию

пользуюсь Delphi 7 так и сделал как ты написал при загрузке Windows программа запускается свёрнутой но при развёртывание форма перестаёт быть на весь экран снизу пропадает кусок на скрине выше видно но как то не понятно если запустить с ярлыка то всё работает правильно.

вот как должно быть

Ответить с цитированием
  #4  
Старый 09.10.2011, 17:27
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

При разворачивании восстанавливай свойства формы, отвечающие за "полноэкранность".
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 09.10.2011, 18:09
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
Вопрос

для полноэкранности использовал WindowState=wsMaximized сворачиваю в трэй
PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 1);
востонавливаю окно
PostMessage(Handle, WM_User + 1, 1, WM_LBUTTONUP);

пробовал восстанавливать свойства формы так
WindowState:=wsMaximized
но результат не изменился как быть?

Последний раз редактировалось Gudzik11, 09.10.2011 в 18:29.
Ответить с цитированием
  #6  
Старый 09.10.2011, 18:44
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А что за WM_USER + 1, как ты его обрабатываешь? И вообще, если бы мы видели весь исходник, дебаг был бы проще.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 09.10.2011, 18:47
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
По умолчанию

вот исходник

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus,ShellAPI, StdCtrls, ExtCtrls, Registry;

type
  TForm1 = class(TForm)
    pmTreyMenu: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    N3: TMenuItem;
    N4: TMenuItem;
        {Трей}
    Procedure ControlWindow(Var Msg:TMessage); message WM_SYSCOMMAND;
    Procedure IconMouse(var Msg:TMessage); message WM_USER+1;
    Procedure  Ic(n:Integer;Icon:TIcon);
    Procedure OnMinimizeProc(Sender:TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
  private
    { Private declarations }
    id1, id2, id3, id4: Integer;
     procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
     function AddNull(InpTime: String): String;
     function MyExitWindows(RebootParam: Longword): Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x: Word;
   Chas: TTime;
  sec: TTime;

implementation

uses Unit2, Unit3;

{$R *.dfm}

  function IsAutorun: Boolean;
var
  reg: TRegistry;
begin
  Result := false;
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  If Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', false) then
    begin
      If reg.ValueExists('Proga') then
        Result :=  LowerCase(reg.ReadString('Proga')) = LowerCase(ParamStr(0));
      reg.CloseKey;
    end;
  reg.Free;
end;

 {======================================}
{Методы для добавления программы в трей}
{======================================}
procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
 GetCursorPos(p); // Запоминаем координаты курсора мыши
 Case Msg.LParam OF  // Проверяем какая кнопка была нажата
  WM_LBUTTONUP,WM_LBUTTONDBLCLK: {Действия, выполняемый по одинарному или двойному щелчку левой кнопки мыши на значке. В нашем случае это просто активация приложения}
                   Begin
                    Ic(2,Application.Icon);  // Удаляем значок из трея
                    ShowWindow(Application.Handle,SW_SHOW); // Восстанавливаем кнопку программы
                    ShowWindow(Handle,SW_SHOW); // Восстанавливаем окно программы
                    Update;
                   End;
  WM_RBUTTONUP: {Действия, выполняемый по одинарному щелчку правой кнопки мыши}
   Begin
    SetForegroundWindow(Handle);  // Восстанавливаем программу в качестве переднего окна
    pmTreyMenu.Popup(p.X,p.Y);  // Заставляем всплыть наше PopMenu
    PostMessage(Handle,WM_NULL,0,0);
   end;
 End;
end;

Procedure TForm1.OnMinimizeProc(Sender:TObject);
Begin
 PostMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0);
End;

Procedure TForm1.ControlWindow(Var Msg:TMessage);
Begin
 IF Msg.WParam=SC_MINIMIZE then
  Begin
   Ic(1,Application.Icon);                    // Добавляем значок в трей
   ShowWindow(Handle,SW_HIDE);                // Скрываем программу
   ShowWindow(Application.Handle,SW_HIDE);  // Скрываем кнопку с TaskBar'а
 End
 else inherited;
End;

Procedure TForm1.Ic(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;
begin
 With Nim do
  Begin
   cbSize:=SizeOf(Nim);
   Wnd:=Self.Handle;
   uID:=1;
   uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
   hicon:=Icon.Handle;
   uCallbackMessage:=wm_user+1;
   szTip :='PC Off';
  End;
 Case n OF
  1: Shell_NotifyIcon(Nim_Add,@Nim);
  2: Shell_NotifyIcon(Nim_Delete,@Nim);
  3: Shell_NotifyIcon(Nim_Modify,@Nim);
 End;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
 ShowMessage('Автор : Gudzik');
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  Ic(2,Application.Icon);
Close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:=FormatDateTime('hh:nn:ss', Time); //Время
end;

procedure TForm1.FormCreate(Sender: TObject);
const
   MOD_ALT = 1;
   MOD_CONTROL = 2;
   MOD_SHIFT = 4;
   MOD_WIN = 8;
   VK_F10 = 121;
   VK_F11 = 122;
   VK_F12 = 123;
Var x:Word;

begin
  PostMessage(Application.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  chas := StrToTime('00:00:00');
  sec:= StrToTime('0:0:1');

  

  // Register Hotkey Ctrl + Alt + F10
  id1 := GlobalAddAtom('Hotkey1');
   RegisterHotKey(Handle, id1, MOD_CONTROL + MOD_Alt, VK_F10);
 
   // Register Hotkey Ctrl + Alt + F11
  id2 := GlobalAddAtom('Hotkey2');
   RegisterHotKey(Handle, id2, MOD_CONTROL + MOD_Alt, VK_F11);
 
   // Register Hotkey Win + F4 
  id3 := GlobalAddAtom('Hotkey3');
   RegisterHotKey(Handle, id3, MOD_CONTROL + MOD_Alt, VK_F12);
 
   // Globally trap the Windows system key "PrintScreen" 
  id4 := GlobalAddAtom('Hotkey4');
   RegisterHotKey(Handle, id4, 0, VK_SNAPSHOT);
   


Label2.Caption:=DateTostr(Date);
x:= DayOfWeek(Date);
  Case x of
  1: Label7.Caption:='воскресенье';
  2: Label7.Caption:='понедельник';
  3: Label7.Caption:='вторник';
  4: Label7.Caption:='среда';
  5: Label7.Caption:='четверг';
  6: Label7.Caption:='пятница';
  7: Label7.Caption:='суббота';
end;
end;

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
 If Msg.HotKey = id1 then //CTRL+ALT+F10
    begin
      If IsWindowVisible(Self.Handle) then
       begin
        PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 1);
        Form3.Close;
        end

      else
       begin
        PostMessage(Handle, WM_User + 1, 1, WM_LBUTTONUP);
        Form3.Close;

        end
    end
  else if Msg.HotKey = id2 then   //  CTRL+ALT+F11
    begin
     Timer2.Enabled:=True ;
     PostMessage(Handle, WM_User + 1, 1, WM_LBUTTONUP);
     chas:=Chas+StrToTime('00:00:35');
     Form3.Close;
     
     end
   else if Msg.HotKey = id3 then  //  CTRL+ALT+F12
   begin
    chas := StrToTime('00:00:00');
    Timer2.Enabled:=False ;
    Label3.Caption:=AddNull(TimeToStr(Chas));
    Form3.Close;
    end





     end;

 // else if Msg.HotKey = id4 then
   // ShowMessage('Print Screen pressed !');
//end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin

  chas:=Chas-sec;
  Label3.Caption:=AddNull(TimeToStr(Chas));
  if TimeToStr(Chas)='0:00:00' then
  begin
    Timer2.Enabled:=False ;
    MyExitWindows(EWX_POWEROFF or EWX_FORCE);
  {ShowMessage('таймер остоновлен !');}

  end
  else
   if TimeToStr(Chas)='0:00:30' then
   begin
     Form3.Label2.Caption:=AddNull(TimeToStr(Chas));
       if (not Assigned(Form3)) then   // проверка существования Формы (если нет, то
       Form3:=TForm3.Create(Self);    // создание Формы)
   Form3.Show; // (или Form2.ShowModal) показ Формы ;
   end;
end;

function TForm1.AddNull(InpTime: String): String;
var S: String;
begin
 S := InpTime;
  if Pos(':', S) - 2 <> 0 then
    Result := S
  else
    begin
      Insert('0', S, 1);
      Result := S
    end;
end;

function TForm1.MyExitWindows(RebootParam: Longword): Boolean;
 var
  TTokenHd: THandle;  
  TTokenPvg: TTokenPrivileges;  
  cbtpPrevious: DWORD;  
  rTTokenPvg: TTokenPrivileges;  
  pcbtpPreviousRequired: DWORD;  
  tpResult: Boolean;  
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
 if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    tpResult := OpenProcessToken(GetCurrentProcess(),  
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      TTokenHd);  
    if tpResult then  
    begin  
      tpResult := LookupPrivilegeValue(nil,
                                       SE_SHUTDOWN_NAME,
                                       TTokenPvg.Privileges[0].Luid);  
      TTokenPvg.PrivilegeCount := 1;  
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;  
      if tpResult then  
        Windows.AdjustTokenPrivileges(TTokenHd,  
                                      False,  
                                      TTokenPvg,  
                                      cbtpPrevious, 
                                      rTTokenPvg, 
                                      pcbtpPreviousRequired); 
    end; 
  end; 
  Result := ExitWindowsEx(RebootParam, 0);
end;

procedure TForm1.N4Click(Sender: TObject);
begin
 ShowMessage('Покозать\скрыть программу    CTRL+ALT+F10'+ #13#10 +'Добавить 10мин к таймеру        CTRL+ALT+F11'+ #13#10 +'сбросить время таймера            CTRL+ALT+F12');
end;

procedure TForm1.N3Click(Sender: TObject);
begin
 if (not Assigned(Form2)) then   // проверка существования Формы (если нет, то
       Form2:=TForm2.Create(Self);    // создание Формы)
   Form2.Show; // (или Form2.ShowModal) показ Формы
end;

end.

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

Последний раз редактировалось Gudzik11, 09.10.2011 в 18:56.
Ответить с цитированием
  #8  
Старый 10.10.2011, 09:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

пойграй с этой "заготовкой". программа запускается скрытой, добавляет свою иконку в трей и себя в автозапуск (HKEY_CURRENT_USER\Software\Microsoft\Windows\Curr entVersion\Run). при клике левой мышкой восстанавливается, при нажатии кнопки свернуть снова прячется.
http://data.cod.ru/128139
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 10.10.2011, 20:32
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
пойграй с этой "заготовкой". программа запускается скрытой, добавляет свою иконку в трей и себя в автозапуск (HKEY_CURRENT_USER\Software\Microsoft\Windows\Curr entVersion\Run). при клике левой мышкой восстанавливается, при нажатии кнопки свернуть снова прячется.
http://data.cod.ru/128139

не понял чё в этой программе не так как в моей в реестр добавляться также вроде сворачиваться тоже

вот моя заготовка может кто глянет в чём дело

Только проблема в том что она начинает работать не правильно только после перезагрузке Windows если с ярлыка то всё окhttp:
Вложения
Тип файла: 7z PCoff 0.5.7z (204.4 Кбайт, 12 просмотров)
Ответить с цитированием
  #10  
Старый 10.10.2011, 21:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Говорят, косноязычность плохо, но косноязычность в письменном виде - кошмар. Перечитывал несколько раз, но так и не смог понять смысл написанного.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 10.10.2011, 23:21
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
Радость

Мне нужно,чтоб моя программка сворачивалась в трэй при запуске.
Я сделал это таким образом :
в OnCreate поместил PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 1); и добавил программу в авто загрузку.
Всё получилось ,программа сворачивается.
При нажатие на кнопку CTRL+ALT+F10 программа должна разворачиваться на весь экран,как на втором скрине,но при перезагрузке Windows программа перестает быть во весь экран,хотя если программу запустить с ярлыка на рабочем столе всё прекрасно работает!
Код моей программы и исходник выше,если не трудно,помогите решить эту проблему!!!
Ответить с цитированием
  #12  
Старый 10.10.2011, 23:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я делаю подругому.
В OnCreate восстанавливаю и в OnDestroy сохраняю размеры и состояние окна (WindowState).
А минимизация призапуске обеспечивается через добавление Application.ShowMainForm := False в файле прокта.
Ответить с цитированием
  #13  
Старый 10.10.2011, 23:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Смотрим код:
Код:
procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
 GetCursorPos(p); // Запоминаем координаты курсора мыши
 Case Msg.LParam OF  // Проверяем какая кнопка была нажата
  WM_LBUTTONUP,WM_LBUTTONDBLCLK: {Действия, выполняемый по одинарному или двойному щелчку левой кнопки мыши на значке. В нашем случае это просто активация приложения}
                   Begin
                    Ic(2,Application.Icon);  // Удаляем значок из трея
                    ShowWindow(Application.Handle,SW_SHOW); // Восстанавливаем кнопку программы
                    ShowWindow(Handle,SW_SHOW); // Восстанавливаем окно программы
                    Update;
                   End;
  WM_RBUTTONUP: {Действия, выполняемый по одинарному щелчку правой кнопки мыши}
   Begin
    SetForegroundWindow(Handle);  // Восстанавливаем программу в качестве переднего окна
    pmTreyMenu.Popup(p.X,p.Y);  // Заставляем всплыть наше PopMenu
    PostMessage(Handle,WM_NULL,0,0);
   end;
 End;
end;
а лучше всё-таки использовать параметр SW_SHOWMAXIMIZED.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 12.10.2011, 21:50
Gudzik11 Gudzik11 вне форума
Начинающий
 
Регистрация: 27.09.2011
Сообщения: 158
Репутация: 10
Радость

Цитата:
Сообщение от angvelem
а лучше всё-таки использовать параметр SW_SHOWMAXIMIZED.

Спасибо всё заработало
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:16.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025