怎么设置程序启动后最小化到托盘?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么设置程序启动后最小化到托盘?相关的知识,希望对你有一定的参考价值。
设了个自启动的程序,运行方式最小化,也设置了最小化到托盘。但启动后会先最小化到桌面下方,要打开在点击最小化才会到托盘。怎么设置程序启动后自动最小化到托盘?
要实现将程序最小化到托盘,就要截获WM_SIZE消息,并作出相应的消息响应。(WM_SIZE在窗口大小改变时被抛出)可以重载OnSize()方法,实现托盘图标。
数据结构NOTIFYICONDATA用来储存托盘图标的信息,结构如下:
typedef struct _NOTIFYICONDATA
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
WCHAR szTip[64];
NOTIFYICONDATA, *PNOTIFYICONDATA;
首先要在对话框类中加入NOTIFYICONDATA变量:
NOTIFYICONDATA nid;
然后要在OnInitDialog()中对nid进行一些初始化:
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); //数据的大小
nid.hWnd = this->GetSafeHwnd(); //获取当前窗口句柄
nid.uID = 100; //指定该nid的ID
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; //定义图标的属性:图标有效|自定义消息有效|鼠标指向显示文字有效
nid.uCallbackMessage = WM_TRAYICON_RESTORE; //定义CALLBACK消息名称,用来响应对托盘图标的操作
nid.hIcon = m_hIcon; //指定显示的图标
wcscpy(nid.szTip, _T("TrayIcon")); //鼠标指向图标时的提示框
当然在头文件中要定义好WM_TRAYICON_RESTORE,
#defined WM_TRAYICON_RESTORE WM_USER+101 //这个值一般要大于100
重载OnSize()方法,假如对话框类是CTrayIconDlg;
void CTrayIconDlg::OnSize(UINT nType, int cx, int cy)
CDialog::OnSize(nType, cx, cy);
if (nType==SIZE_MINIMIZED) //如果事件为最小化
Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗口
运行程序,最小化窗口,是不是成功将窗口藏到系统托盘了。
现在还不能让程序窗口还原,无论单击,双击小图标都没反应,那是因为没有对其消息进行处理。
首先在CTrayIconDlg类中加入方法:
afx_msg LRESULT OnRestore(WPARAM wParam, LPARAM lParam);
实现如下:
LRESULT CTrayIconDlg::OnRestore(WPARAM wParam, LPARAM lParam)
if( lParam == WM_LBUTTONDOWN ) //如果在图标中单击左键则还原
ShowWindow(SW_SHOWNORMAL); //显示主窗口
this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面
//Shell_NotifyIcon(NIM_DELETE,&nid); //若加入这行,则在窗口还原后删除托盘图标,否则保留托盘图标
return 0;
把该方法加入消息映射表:
将ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)插到映射表中
BEGIN_MESSAGE_MAP(CForexDemoDlg, CDialog)
...
...
ON_MESSAGE(WM_TRAYICON_RESTORE, OnRestore)
END_MESSAGE_MAP() 参考技术A 要程序本身支持,不支持的要用托盘管理软件。
程序本身不支持怎么设置也没用
Java的。最小化到系统托盘
我有一个应用程序检查密码,如果密码正确,应该最小化到系统托盘。但我不知道如何设置frame
隐形或使用ActionListener
最小化它。
public class MainWindow extends JFrame {
private JPanel panel1;
private JTextField Password;
private JButton readyBtn;
private JLabel label1;
private JLabel label2;
int count = 0;
public MainWindow() {
readyBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String password = Password.getText();
if (password.equals("12345")) {
//minimize to system tray
}
}
});
}
public static void main(String[] args) {
JFrame frame = new JFrame("MainWindow");
frame.setContentPane(new MainWindow().panel1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
//frame.setUndecorated(true);
frame.pack();
TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().getImage("res/lock.png"));
trayIcon.setToolTip("Running...");
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
JOptionPane.showMessageDialog(null, "Clicked");
}
});
try {
SystemTray.getSystemTray().add(trayIcon);
}catch (Exception e){
System.out.println(e);
}
}
}
答案
您可以使用
frame.setExtendedState(JFrame.ICONIFIED);
以上是关于怎么设置程序启动后最小化到托盘?的主要内容,如果未能解决你的问题,请参考以下文章