// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0); ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW); WINDOWPLACEMENT wp; wp.length=sizeof(WINDOWPLACEMENT); wp.flags=WPF_RESTORETOMAXIMIZED; wp.showCmd=SW_HIDE; SetWindowPlacement(&wp); // SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0); return TRUE; // return TRUE unless you set the focus to a control} void CSecuryEntryDlg::OnSysCommand(UINT nID, LPARAM lParam) { if( nID == SC_MINIMIZE ) { AddShellIcon(); return; } if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }void CSecuryEntryDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } HCURSOR CSecuryEntryDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CSecuryEntryDlg::RemoveShellIcon() { //不必判断是否已经增加图标,系统会自动不增加,假如已经增加 NOTIFYICONDATA Notify; Notify.cbSize = sizeof(NOTIFYICONDATA); Notify.hWnd = AfxGetMainWnd()->GetSafeHwnd(); Notify.uID = 0; Notify.uFlags = 0; //删除托盘内CW图标并清除托盘图标标志 Shell_NotifyIcon( NIM_DELETE, &Notify ); }void CSecuryEntryDlg::AddShellIcon() { NOTIFYICONDATA Notify; Notify.cbSize = sizeof(NOTIFYICONDATA); Notify.hWnd = AfxGetMainWnd()->m_hWnd; Notify.uID = 0; Notify.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; Notify.uCallbackMessage = WM_NOTIFYICON_MESSAGE; strcpy( Notify.szTip, szMsg); Notify.hIcon =pApp->LoadIcon( IDR_MAINFRAME ); //在托盘内添加CW图标并隐藏CW BOOL bResult=Shell_NotifyIcon(NIM_ADD,&Notify); ShowWindow(SW_HIDE); } void CSecuryEntryDlg::OnNotifyIconMessage(WPARAM wParam,LPARAM lParam) { if( wParam==0 ) { switch( lParam ) { case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: { // //鼠标右击托盘图标时出现的快捷菜单 POINT pt; CMenu mnShellPop,*mnShellContext; ::GetCursorPos(&pt); mnShellPop.LoadMenu(IDR_FLOAT_MENU); mnShellContext=mnShellPop.GetSubMenu(0); SetForegroundWindow(); mnShellContext->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,pt.x,pt.y,this);
} break; case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: // if ( IsWindowVisible()==FALSE ) // ShowWindow(SW_SHOW); SetForegroundWindow(); // //删除托盘内图标并恢复窗口 // ShowWindow(SW_SHOW); RemoveShellIcon(); break; default: break; } //switch end } //if end }
//在主窗口的OnCreate()中:
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
m_tnid.hWnd =this->m_hWnd;
m_tnid.uID = IDR_MAINFRAME;
m_tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
m_tnid.uCallbackMessage = MYWM_NOTIFYICON;
HICON hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_tnid.hIcon=hIcon;
strcpy(m_tnid.szTip, "My test"); if(::Shell_NotifyIcon(NIM_ADD, &m_tnid)==0)
return FALSE;
//清除系统托盘上的ICON,在主窗口的OnClose()中:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
CFrameWnd::OnClose();
//程序启动时最小化,InitInstance()中:
找到这句,m_pMainWnd->ShowWindow(SW_SHOW);
SW_SHOW换成SW_HIDE
//程序启动时最小化,InitInstance()中:
找到这句,m_pMainWnd->ShowWindow(SW_SHOW);
SW_SHOW换成SW_MINIMIZE
不只适用于Dialog based程序,普通窗口也一样
to rchgq (小荷)
这个问题解决比较烦,不过我已经解决了.
你发邮件到[email protected],我发个代码给你
ShowWindow(SW_MINIMIZE);
就可以了。对话框也是CWnd派生出来的嘛,ShowWindow()很强大的喔,看看MSDN帮助,多试试,自有好处。
因为我在这里得到过很多热心帮助,所以尽管自己所知很少,但很希望能给这个社区出点力气,得不得分无所谓。感谢 vtable9999(肝肝肝肝) 有效提示,请多指教。希望CSDN兴旺发达!!!
up!up!up!up!up!up!up!up!!!
this->ShowWindow(SW_SHOW);
this->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
我把ShowWindow(SW_HIDE)放在InitInstance()中好像没什么用.
ShowWindow(SW_HIDE);应该放在OnPaint()中,哈哈,这种做法是不是怪怪的?
做任务栏图标嘛,我就不用罗索了吧?
ShowWindow(SW_SHOW);
ShowWindow(SW_MINIMIZE);
加入显示任务栏图标的代码;
ShowWindow(SW_HIDE);
ShowWindow(SW_SHOW);
ShowWindow(SW_MINIMIZE);
加入显示任务栏图标的代码;
ShowWindow(SW_HIDE);
ShowWindow(SW_MINIMIZE);一次的话,也不行的,过后又会跑出来的。
一直都执行也是不可能的,难道真的没有办法吗?
我看金山词霸就可以,不知道他们是怎么做的。
我试了一下 似乎是可以的//在主窗口的OnCreate()中:
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
m_tnid.hWnd =this->m_hWnd;
m_tnid.uID = IDR_MAINFRAME;
m_tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
m_tnid.uCallbackMessage = WM_NOTIFY;
HICON hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_tnid.hIcon=hIcon;
strcpy(m_tnid.szTip, "My test"); if(::Shell_NotifyIcon(NIM_ADD, &m_tnid)==0)
return FALSE;
//清除系统托盘上的ICON,在主窗口的OnClose()中:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
CFrameWnd::OnClose();
在OnInitDialog()里加入://隐藏窗体:WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(& wp); //在任务栏和atl+tab列表中隐藏:ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
下面是jackstraw_lee(稻草人) 的回贴,和我的问题一模一样,看来这个问题不少人碰到过。回复人: jackstraw_lee(稻草人) ( ) 信誉:100 2002-06-11 18:37:00 得分:0
我试验了好几种方法,目前对话框程序都无法实现启动的时候就进入到托盘,而不显示主界面。现在只能实现主界面先出来,然后通过按钮实现挂到托盘区。如果哪位大侠可以做到启动的时候就可以挂到托盘,麻烦告知如何实现的。
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
我现在就这样做的,很好呀,启动时就没有显示,直接加到托盘,
我还觉得没有提示不好,自己又加了个无模式对话框的封面,哈哈
你的方法没显示图标,程序一启动,我要把图标放到托盘区。
OnInitDialog中
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
要保证只有一个应用程序实例,可以用互斥体。
example:
CreateMutex(NULL, FALSE, _T("SpyHook"));
if(GetLastError()==ERROR_ALREADY_EXISTS)
OnOK();
要保证只有一个应用程序实例,可以用互斥体。
example:
CreateMutex(NULL, FALSE, _T("SpyHook"));
if(GetLastError()==ERROR_ALREADY_EXISTS)
OnOK();
OnInitDialog中
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
一启动真的能最小化到托盘区,但左击鼠标按键时,图标消失同时对话框也不会显示出来了。
//在主窗口的OnCreate()中:
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
m_tnid.hWnd =this->m_hWnd;
m_tnid.uID = IDR_MAINFRAME;
m_tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
m_tnid.uCallbackMessage = MYWM_NOTIFYICON;
HICON hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_tnid.hIcon=hIcon;
strcpy(m_tnid.szTip, "My test"); if(::Shell_NotifyIcon(NIM_ADD, &m_tnid)==0)
return FALSE;
//清除系统托盘上的ICON,在主窗口的OnClose()中:
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
CFrameWnd::OnClose();
//程序启动时最小化,InitInstance()中:
找到这句,m_pMainWnd->ShowWindow(SW_SHOW);
SW_SHOW换成SW_HIDE
http://www.csdn.net/expert/topic/799/799900.xml?temp=3.342837E-02
您的方法管用,对话框确实隐藏了,但我不知道怎样才能使恢复显示,象一般的非对话框程序那样,在自定义消息处理函数中ShowWindow(SW_SHOW);ShowWindow(SW_RESTORE);就可以了,但现在行不通。我尝试隐藏操作的泥运算,也不行WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
//wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_SHOW;
SetWindowPlacement(&wp);
ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);
void CXXXDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
if((SC_MINIMIZE == nID))
{
MinimizeDlg();//这里就时调用Shell_notify的地方
}
}
}然后简单的在OnInitDialog()最后加一句:
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
注意:是PostMessage,不是SendMessage
1、(不太好)先添加托盘图标(顶楼方法),然后在OnInitDialog中SetTimer(0,500,NULL),然后在OnTimer中ShowWindow(SW_HIDE)就可以了,不过你可以看到对话框在屏幕上闪了一下。
2、(效果很好)不要在APP中DoModal对话框,而是在APP中创建一个线程,在线程中把对话框Create出来,在Create后,ShowWindow(SW_HIDE),就可以了,托盘图标不管你在哪里实现都行(不是主要问题)。
BOOL CSecuryEntryDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);
// SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
return TRUE; // return TRUE unless you set the focus to a control}
void CSecuryEntryDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if( nID == SC_MINIMIZE )
{
AddShellIcon();
return;
}
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}void CSecuryEntryDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CSecuryEntryDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSecuryEntryDlg::RemoveShellIcon()
{
//不必判断是否已经增加图标,系统会自动不增加,假如已经增加
NOTIFYICONDATA Notify;
Notify.cbSize = sizeof(NOTIFYICONDATA);
Notify.hWnd = AfxGetMainWnd()->GetSafeHwnd();
Notify.uID = 0;
Notify.uFlags = 0;
//删除托盘内CW图标并清除托盘图标标志
Shell_NotifyIcon( NIM_DELETE, &Notify );
}void CSecuryEntryDlg::AddShellIcon()
{
NOTIFYICONDATA Notify;
Notify.cbSize = sizeof(NOTIFYICONDATA);
Notify.hWnd = AfxGetMainWnd()->m_hWnd;
Notify.uID = 0;
Notify.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
Notify.uCallbackMessage = WM_NOTIFYICON_MESSAGE;
strcpy( Notify.szTip, szMsg);
Notify.hIcon =pApp->LoadIcon( IDR_MAINFRAME );
//在托盘内添加CW图标并隐藏CW
BOOL bResult=Shell_NotifyIcon(NIM_ADD,&Notify);
ShowWindow(SW_HIDE);
}
void CSecuryEntryDlg::OnNotifyIconMessage(WPARAM wParam,LPARAM lParam)
{
if( wParam==0 )
{
switch( lParam )
{
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK: {
//
//鼠标右击托盘图标时出现的快捷菜单
POINT pt;
CMenu mnShellPop,*mnShellContext;
::GetCursorPos(&pt);
mnShellPop.LoadMenu(IDR_FLOAT_MENU);
mnShellContext=mnShellPop.GetSubMenu(0);
SetForegroundWindow();
mnShellContext->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,pt.x,pt.y,this);
}
break;
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
// if ( IsWindowVisible()==FALSE )
// ShowWindow(SW_SHOW);
SetForegroundWindow();
// //删除托盘内图标并恢复窗口
// ShowWindow(SW_SHOW);
RemoveShellIcon();
break;
default:
break;
} //switch end
} //if end
}