如何使程序启动后最小化到状态栏(时间旁边)(100分)

  • 主题发起人 主题发起人 steven.xy
  • 开始时间 开始时间
用这个控件吧,带源码.
http://vcl.vclxx.org/DELPHI/D32FREE/COOLTRAY.ZIP
 
用控件多没水平!
 
下面是俺用C++Builder写的一个程序,你把他改成Delphi的就可以了

在工程文件中:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
; ; try
; ; {
; ; ; ; //====利用互斥,防止多个程序运行====
; ; ; ; HANDLE hMutex=CreateMutex(NULL,TRUE,"Simba_Run");
; ; ; ; if(hMutex==NULL||GetLastError() == ERROR_ALREADY_EXISTS)
; ; ; ; {
; ; ; ; ShowMessage("程序已经运行");
; ; ; ; CloseHandle(hMutex);
; ; ; ; return FALSE;
; ; ; ; }
; ; ; ; //==================================
; ; ; ; ; ;
; ; ; ; Application->Initialize();

; ; ; ; //=====隐藏主窗体=====
; ; ; ; ShowWindow(Application->Handle,SW_HIDE);
; ; ; ; Application->ShowMainForm = false;
; ; ; ; //====================

; ; ; ; Application->CreateForm(__classid(TForm1), &Form1);
; ; ; ; ;Application->CreateForm(__classid(TForm2), &Form2);
; ; ; ; ;Application->Run();
; ; }
; ; catch (Exception &exception)
; ; {
; ; ; ; Application->ShowException(&exception);
; ; }
; ; return 0;
}
//---------------------------------------------------------------------------


在main函数中:
//---------------------------------------------------------------------------
//主窗体创建
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{ ;
; ; AddTrayIcon();
; ; SetToolWindow(Handle);
}
//---------------------------------------------------------------------------
//设置当前窗体属性,不在任务栏出现
//---------------------------------------------------------------------------
void __fastcall TForm1::SetToolWindow(HANDLE hWin)
{
; ; DWORD dwStyle;
; ; dwStyle = GetWindowLong(hWin,GWL_EXSTYLE);
; ; dwStyle |= WS_EX_TOOLWINDOW;
; ; SetWindowLong(Application->Handle,GWL_EXSTYLE,dwStyle);
}
//---------------------------------------------------------------------------
// 添加系统托盘函数
//---------------------------------------------------------------------------
void __fastcall TForm1::AddTrayIcon()
{
; ; NOTIFYICONDATA icon;
; ; icon.cbSize=sizeof(NOTIFYICONDATA);
; ; icon.hWnd=Handle;
; ; icon.uID=200;
; ; strncpy(icon.szTip,"YourAppName",sizeof(icon.szTip));
; ; icon.hIcon=Application->Icon->Handle;
; ; icon.uCallbackMessage=MYWM_NOTIFY;
; ; icon.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
; ; Shell_NotifyIcon(NIM_ADD,&icon);
}
//---------------------------------------------------------------------------
// 删除系统托盘函数
//---------------------------------------------------------------------------
void __fastcall TForm1::RemoveTrayIcon()
{
; ; NOTIFYICONDATA icon;
; ; icon.cbSize=sizeof(NOTIFYICONDATA);
; ; icon.uID=200;
; ; icon.hWnd=Handle;
; ; Shell_NotifyIcon(NIM_DELETE,&icon);
}
//---------------------------------------------------------------------------
// 相应系统托盘消息,显示菜单
//---------------------------------------------------------------------------
void __fastcall TForm1::OnDispPassWord(TMessage &Message)
{
; ; POINT p;
; ; switch(Message.LParam)
; ; {
; ; ; ; case WM_RBUTTONUP: //鼠标右键单击
; ; ; ; ; ; GetCursorPos(&p); //获取坐标
; ; ; ; ; ; PopupMenu1->PopupComponent=Form1; //当前位置显示菜单
; ; ; ; ; ; SetForegroundWindow(Handle);
; ; ; ; ; ; PopupMenu1->Popup(p.x,p.y);
; ; ; ; ; ; break;
; ; ; ; ; ;
; ; ; ; case WM_LBUTTONUP: //鼠标左键单击
; ; ; ; ; ; if(Visible == false)
; ; ; ; ; ; {
; ; ; ; ; ; ; ; //DoSomething....
; ; ; ; ; ; ; ; N1->Enabled=false;
; ; ; ; ; ; ; ; N2->Enabled=true;
; ; ; ; ; ; ; ; Show();
; ; ; ; ; ; }
; ; ; ; ; ; SetForegroundWindow(Handle); //使窗体在激活状态显示
; ; ; ; ; ; break;
; ; }
; ; TForm::Dispatch(&Message);
}
//---------------------------------------------------------------------------
//程序退出
//---------------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
; ; RemoveTrayIcon();
; ; Application->Terminate();
}
 
对了,别忘了定义消息和函数:

//=====托盘消息=====
#define MYWM_NOTIFY (WM_APP+100)

//===托盘消息映射===
; ; BEGIN_MESSAGE_MAP
; ; MESSAGE_HANDLER(MYWM_NOTIFY,TMessage,OnDispPassWord)
; ; END_MESSAGE_MAP(TForm)

//====处理托盘函数定义====
; ; void __fastcall AddTrayIcon();
; ; void __fastcall RemoveTrayIcon();
; ; void __fastcall OnDispPassWord(TMessage &Message);
; ; void __fastcall SetToolWindow(HANDLE hWin);
 
控件:http://202.120.85.61:8080/jcvslet/JCVSlet/list/dfwGate/dfwGate/components

范例程序:http://202.120.85.61:8080/jcvslet/JCVSlet/list/dfwGate/dfwGate/TrayAppSkeleton
 
呵呵,孙老师也来回答问题。。。
俺也姓孙,不过是学生。
 
to:simbasun
;小弟惭愧,从来没有用过C++Builder,对Delphi也只是会用一些控件。所以,不会修改。
请指教!
 
给出一个Delphi示例。不过网上这种程序太多了,仅参考吧,给不给分无所谓。
在大富翁上搜一下,你就能发现一些。

unit unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Forms, //Dialogs,
; StdCtrls, Menus, Controls, ShellApi; //加上ShellApi

const
; {自定义消息,当小图标捕捉到鼠标事件时Windows向回调函数发送此消息}
; MYTRAY_MESSAGE = WM_USER + 100; ;//托盘图标返回消息

type
; TMainForm = class(TForm)

; ; TrayPopMenu: TPopupMenu;
; ; ; pop1: TMenuItem;
; ; ; pop2: TMenuItem;
; ; ; N3: TMenuItem;
; ; ; popExit: TMenuItem;
; ; //窗口事件
; ; procedure FormCreate(Sender: TObject);
; ; procedure FormClose(Sender: TObject; var Action: TCloseAction);
; ; procedure FormDestroy(Sender: TObject);
; ; procedure FormPaint(Sender: TObject);
; ; //弹出菜单事件
; ; procedure popExitClick(Sender: TObject);

; private
; ; { Private declarations }
; ; TrayIconData : TNotifyIconData; ; ; ;//定义托盘图标结构
; ; //托盘消息处理事件
; ; procedure MyTrayMessage(var message:TMessage);message MyTRAY_MESSAGE;
; ;
; public
; ; { Public declarations }
; end;

var
; MainForm: TMainForm;

implementation

{$R *.DFM}


// ;窗口事件
//----------------------------------------------------------------
procedure TMainForm.FormCreate(Sender: TObject);
{var
; ZAppName: array[0..127] of char;
; Hold: String;
; Found: HWND;
}
begin
; //建立托盘图标
; TrayIconData.cbSize := sizeof(TrayIconData); //TrayIconData变量的字节数
; TrayIconData.Wnd := Handle; ; //主窗口句柄
; TrayIconData.uID := 1; ; ; ; ;//内部标识,可设为任意数
; TrayIconData.hIcon := Icon.Handle;
; //要加入的图标句柄,可任意指定,此处为在Tform中Icon属性中指定的图标
; //TrayIconData.hIcon := Application.Icon.Handle;
; //此句使用了程序的图标,和上句程序有区别,下句亦可,但推荐使用上句,这样图标加
; //入到托盘中时图标不会走样。
; //TrayIconData.hIcon := LoadIcon(0,IDI_APPLICATION);
; TrayIconData.szTip := '系统托盘示例程序'; ; // 图标的提示信息,即黄色的Hint
; TrayIconData.uCallbackMessage := CDROMTRAY_MESSAGE; ; //回调函数消息
; TrayIconData.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; //指明哪些字段有效


; {将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}
; SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
; //向托盘中添加图标
; Shell_NotifyIcon(NIM_ADD, @TrayIconData);

end;


procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
; TrayIconData.cbSize := sizeof(TrayIconData); ; //TrayIconData变量的字节数
; TrayIconData.uID := 1; ; ; ; ;//内部标识,与加入小图标时的数一致
; TrayIconData.Wnd := Handle; ; //主窗口句柄
; //TrayIconData.uFlags := 0;
; Shell_NotifyIcon(NIM_DELETE, @TrayIconData); ; //去掉小图标

end;


//------------------------------------------------------------------


//托盘消息处理事件
//------------------------------------------------------------------
procedure TMainForm.CDRomTrayMessage(var message: Tmessage);
var
; CursorPos : TPoint;

begin
; //在这里处理用户点击托盘图标事件,可以根据WM_MOUSEMOVE消息的不同情况产生不同的
; //回应,例如区别对待单击和双击等等
; case message.lParam of
; //
; //WM_LBUTTONDOWN :
; ; //mcisendstring( pchar(cdromStatus),nil,0,handle);
; ; //if not Busy then begin

; ; //ShowWindow(Handle, SW_SHOW );

; WM_RBUTTONDOWN :
; begin
; ; GetCursorPos(CursorPos);
; ; SetForegroundWindow(handle);
; ; //此句作用是当程序失去焦点时,弹出菜单也随之消失。
; ; Application.ProcessMessages;
; ; //取得光标当前位置
; ; TrayPopMenu.Popup( CursorPos.x ,CursorPos.y );
; ; PostMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
; end;
; end;

end;
//----------------------------------------------------------

//弹出菜单事件
//----------------------------------------------------------
procedure TMainForm.popExitClick(Sender: TObject);
begin
; Close;
end;
//----------------------------------------------------------

procedure TMainForm.FormPaint(Sender: TObject);
begin
; Hide;
end;

end.
 
用控件没有水平,抄人家的代码就很有水平吗?
要想有水平,最好一个也别有delphi的控件,那是什么水平啊 ?
最高水平的人写出最低水平的代码,也就是这种水平了。
实在是可笑!
请注意:用delphi的人的思路应该和用VC的人是不一样的,否则,不如用VC算了。
 
接受答案了.
 
后退
顶部