Форум: "Начинающим";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
ВнизПомогите написать "Уведомлятель" Найти похожие ветки
← →
Dennis I. Komarov © (2008-07-14 09:50) [40]Удалено модератором
← →
Palladin © (2008-07-14 09:58) [41]
> Как сделать чтобы программа нормально разворачивалась/сворачивалась
> трэй?
надо:
нормально показать иконку в трее (можно много)
нормально свернуть приложение
нормально скрыть приложение из панели задач
позже, при каком либо событии
нормально показать приложение на панели задач
нормально восстановить приложение на рабочем столе
по желанию, нормально убрать иконку из трея (можно все)
← →
Anatoly Podgoretsky © (2008-07-14 10:02) [42]Зачем так много слов!
Надо просто нормально написать программу.
← →
Костик (2008-07-14 11:34) [43]
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellApi, StdCtrls, Menus, Registry;
.....
procedure ActionIcon(n: Integer; Icon: TIcon);
procedure WindowsMessage(var Msg:TMessage); message M_SYSCOMMAND;
procedure OnMinimizeProc(Sender: TObject);
procedure IconMouseClick(var Msg:TMessage); message WM_USER + 1;
.....
function IsRunWithWin: boolean;
var
Reg: TRegistry;
bIs: boolean;
List: TStringList;
I: Integer;
begin
bIs := False;
Reg := TRegistry.Create;
List := TStringList.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey("\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True) then
begin
Reg.GetValueNames(List);
for I:=0 to List.Count-1 do
begin
if List.Strings[I] = "YouMemory 1.0" then
begin
bIs := True;
break;
end;
end;
end;
finally
Reg.Free;
List.Free
end;
Result := bIs;
end;
procedure WriteReg(Status:boolean);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey("\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True) then
begin
if Status then
Reg.WriteString("YouMemory 1.0",""" + Application.ExeName + """)
else
Reg.DeleteValue("YouMemory 1.0");
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
//Посылаем подальше RX_Tray_Icon
procedure TForm1.ActionIcon(n: Integer; Icon: TIcon);
var Nim: TNotifyIconData;
begin
with Nim do
begin
cbSize := SizeOf(Nim);
Wnd := Form1.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
hIcon := Icon.Handle;
uCallbackMessage := WM_USER + 1;
szTip := "Уведомитель";
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.WindowsMessage(var Msg:TMessage);
begin
if Msg.WParam = SC_MINIMIZE then
begin
ActionIcon(1, Application.Icon); //нормально показываем иконку в трэе
ShowWindow(Handle, SW_HIDE); //нормально скрываем приложение
ShowWindow(Application.Handle, SW_HIDE); //нормально скрываем приложение из панели задач
end
else
inherited;
end;
procedure TForm1.OnMinimizeProc(Sender: TObject);
begin
PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0); //нормально запускаем WindowsMessage
end;
procedure TForm1.IconMouseClick(var Msg:TMessage);
var p: TPoint;
begin
GetCursorPos(p);
Case Msg.LParam of
WM_LBUTTONUP, WM_LBUTTONDBLCLK:
begin
ActionIcon(2, Application.Icon); //нормально удаляем иконук из трея
ShowWindow(Application.Handle, SW_SHOW); //нормально восстанавливаем приложение на панели задач
ShowWindow(Handle, SW_SHOW); // нормально восстанавливаем приложение на рабочем столе
SetForegroundWindow(Handle);
end;
WM_RBUTTONUP:
begin
SetForegroundWindow(Handle);
PopupMenu1.Popup(p.X,p.Y);
PostMessage(Handle, WM_NULL, 0, 0);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := OnMinimizeProc;
CheckBox1.Checked := IsRunWithWin;
Application.Minimize;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
WriteReg(CheckBox1.Checked)
end;
← →
Anatoly Podgoretsky © (2008-07-14 11:44) [44]
> Костик (14.07.08 11:34) [43]
Что сказать то хотел?
← →
Костик (2008-07-14 12:07) [45]
> Что сказать то хотел?
Да ниче... Всем спасибо )
← →
Костик (2008-07-14 14:43) [46]Скажите пожалуйста как записать в реестр чтобы программа запускалась в определенный момент времени или спустя некоторое время после запуска виндовс.
И еще если не трудно как из приложения можно выключить компьютер .. и как отправить его в ждущий режим...???
Заранее очень благодарю...
← →
Denis__ © (2008-07-14 19:05) [47]TTimer.
var
ph: THandle;
tp, prevst: TTokenPrivileges;
rl: DWORD;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, ph);
LookupPrivilegeValue(nil, "SeShutdownPrivilege", tp.Privileges[0].Luid);
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := 2;
AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl);
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
end;
← →
Костик (2008-07-15 09:59) [48]
> Denis__ © (14.07.08 19:05) [47]
> TTimer.
Благодарю... А если какая то программа помешает выключению, как проверить?
← →
brother © (2008-07-15 10:03) [49]> А если какая то программа помешает выключению, как проверить?
100% выключение гарантирует только отключение питания... ;)
← →
Костик (2008-07-15 10:06) [50]
> 100% выключение гарантирует только отключение питания...
> ;)
ну это понятно, а по сути я бы проверил, если работает винда еще то выключил бы "Контрольный" раз )
← →
brother © (2008-07-15 10:12) [51]> "Контрольный"
ну если какое-либо приложение блокирует завершение, тогда послать всем килл олл
← →
Anatoly Podgoretsky © (2008-07-15 10:18) [52]> Костик (15.07.2008 10:06:50) [50]
Из выключеного приложения :-)
← →
brother © (2008-07-15 10:40) [53]> выключеного приложения
новые понятия в программистике? ;)
← →
Костик (2008-07-15 10:49) [54]Не знаю как у Вас, но у меня пока ни одна прога не поборола
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0)
хе-хе...
Вот только проблемка - есть EWX_LOGOF типа "вылогиться" но он тушит все процессы, а я бы хотел чтобы было как "Пуск/Выход из системы/смена пользователя/" ООООО. а может так и сделать..? тоесть надо отправить Cntr+Esc, стрелка вверх, стрелка вправо, ввод, ввод.... Э не а если мышка в этот момент будет в этой области но чуть выше - не не катит... что делать?
заодно, чтобы не показаться наглым)), подскажите как мне сделать всплывающее окошко как у isq? чтобы оно поверх всех окон всплывало..?
заранее очень благодарю.
← →
brother © (2008-07-15 10:53) [55]не пиши ерунды...
← →
Костик (2008-07-15 11:12) [56]Вот я пишу:
SetForegroundWindow(Form2.Handle);
Form2.ShowModal;
ShowWindow(Form2.Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);
а хочеться поверх всех окон чтобы была форма...
и еще вопрос если можно, в примере выше [43] я определил момент "свертывания" приложения а можно вместо "свертывания" определить так метод закрытия формы (когда на крестик нажимешь у главной формы как в uTorrent)
← →
brother © (2008-07-15 11:20) [57]> а хочеться поверх всех окон чтобы была форма...
начинается ((((
← →
DVM © (2008-07-15 12:02) [58]
> Denis__ © (14.07.08 19:05) [47]
Хоть бы в одной функции проверил код возврата. И хэндлы закрывать надо.
← →
Костик (2008-07-15 12:17) [59]Вот дописал [56] :
procedure TForm2.FormShow(Sender: TObject);
begin
SetWindowPos(Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE OR SWP_NOSIZE OR SWP_SHOWWINDOW OR SWP_NOSENDCHANGING);
end;
Вроде ниче только не активное....
Еще дописал [56] :
procedure TForm1.WindowsMessage(var Msg:TMessage);
begin
if (Msg.WParam = SC_MINIMIZE) or (Msg.WParam = SC_CLOSE) then
begin
ActionIcon(1, Application.Icon); ShowWindow(Handle, SW_HIDE); ShowWindow(Application.Handle, SW_HIDE);
end
else
inherited;
end;
но не пойму откуда посылать
PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
вот
procedure TForm1.OnCloseProc(Sender: TObject);
begin
PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;
если там [56]
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := OnMinimizeProc;
то к чему присвоить (переопределить) OnCloseProc ?
← →
Правильный$Вася (2008-07-15 12:25) [60]напоминает школьника из моего дества, которые учились драться по видеоиграм типа мортал-комбата
← →
brother © (2008-07-15 12:34) [61]> учились драться по видеоиграм типа мортал-комбата
круто!)
← →
Костик (2008-07-15 12:34) [62]
> Правильный$Вася (15.07.08 12:25) [60]
> напоминает школьника из моего дества, которые учились драться
> по видеоиграм типа мортал-комбата
за собой следить надо
← →
brother © (2008-07-15 12:55) [63]> за собой следить надо
следи за собой, будь осторожен (с) Кино
← →
Костик (2008-07-15 13:02) [64]так что
procedure OnMinimizeProc(Sender: TObject);
вообще не нужна
и
можно сделать так:
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Application.OnMinimize := OnMinimizeProc;}
PostMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
ниче не пойму...
что написав утэто
procedure WindowsMessage(var Msg:TMessage); message WM_SYSCOMMAND;
уже все перехвачено?
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.051 c