如何使程序一启动,对话框就最小化到任务栏中。拜托,100分相送。

解决方案 »

  1.   

    首先实现托盘图标
    //在主窗口的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
      

  2.   

    选择窗体初始化状态为Minimized。
      

  3.   

    原来你要的是任务栏中的最小化,而不是托盘图标。那就更简单了。
    //程序启动时最小化,InitInstance()中:
    找到这句,m_pMainWnd->ShowWindow(SW_SHOW);
    SW_SHOW换成SW_MINIMIZE
    不只适用于Dialog based程序,普通窗口也一样
      

  4.   

    to mrlp():他的是对话框程序,无法这样做!!!
    to rchgq (小荷) 
    这个问题解决比较烦,不过我已经解决了.
    你发邮件到[email protected],我发个代码给你
      

  5.   

    只要在对话框类的OnInitDialog()末尾写一句
    ShowWindow(SW_MINIMIZE);
    就可以了。对话框也是CWnd派生出来的嘛,ShowWindow()很强大的喔,看看MSDN帮助,多试试,自有好处。
      

  6.   

    嗯,最小化是可以用mrlp()的方法。我以前解决的是对话框程序启动隐藏,在OnInitDialog()用ShowWindow(SW_HIDE)则不行
      

  7.   

    mrlp():你太搞笑了。这么一个简单的问题,去两次会错题意。细心啊。
      

  8.   

    感谢 lanzhengpeng2(兰征鹏) 善意提醒,太粗心了。
    因为我在这里得到过很多热心帮助,所以尽管自己所知很少,但很希望能给这个社区出点力气,得不得分无所谓。感谢 vtable9999(肝肝肝肝) 有效提示,请多指教。希望CSDN兴旺发达!!!
      

  9.   

    看到这么好的讨论气氛,感动。
    up!up!up!up!up!up!up!up!!!
      

  10.   

    我也说一句,在initdialog里加上这两句试试:
    this->ShowWindow(SW_SHOW);
    this->SendMessage(WM_SYSCOMMAND, SC_MINIMIZE);
      

  11.   

    真是出门遇贵人,pp_ipr()的方法管用。
      

  12.   

    to  vtable9999(肝肝肝肝) ,我发了一个邮件给你,谢谢你。在线等你的代码。
      

  13.   

    先ShowWindow(SW_MINIMIZE)l;然后用顶楼的办法在任务栏上做出一个图标,最后再ShowWindow(SW_HIDE);
      

  14.   

    图标已经做好了,就是不知把ShowWindow(SW_HIDE)放在哪个位置,在InitInstance()中好像不行.
      

  15.   

    图标已经做好了,只是不知把ShowWindow(SW_MINIMIZE)和ShowWindow(SW_HIDE)放在哪个位置?
    我把ShowWindow(SW_HIDE)放在InitInstance()中好像没什么用.
      

  16.   

    啊哈,居然有这么多回答。
    ShowWindow(SW_HIDE);应该放在OnPaint()中,哈哈,这种做法是不是怪怪的?
    做任务栏图标嘛,我就不用罗索了吧?
      

  17.   

    如果把ShowWindow(SW_HIDE放在OnPaint()中,一运行我的对话框和图标都不见了.
      

  18.   

    放在OnPaint()中可以解决掉一启动就挂到托盘去吗?反正放在OnInitDialog中是不行的
      

  19.   

    楼上的方法不是太好吧。如果以后想把对话框再显示出来不是很麻烦?在OnInstance中加入:
    ShowWindow(SW_SHOW);
    ShowWindow(SW_MINIMIZE);
    加入显示任务栏图标的代码;
    ShowWindow(SW_HIDE);
      

  20.   

    在OnInstance中加入:
    ShowWindow(SW_SHOW);
    ShowWindow(SW_MINIMIZE);
    加入显示任务栏图标的代码;
    ShowWindow(SW_HIDE);
      

  21.   

    ahphone(根号6.0) ,那怎么办,这样不行的.
      

  22.   

    在OnPaint只执行:ShowWindow(SW_SHOW);
    ShowWindow(SW_MINIMIZE);一次的话,也不行的,过后又会跑出来的。
    一直都执行也是不可能的,难道真的没有办法吗?
    我看金山词霸就可以,不知道他们是怎么做的。
      

  23.   

    用CreateWindowEx()创建一个最小化窗体如何?
      

  24.   

    使用MoveWindow()函数,把里面的关于窗口位置的参数设置到屏幕的外面。如(0,10000)。这样,就看不到界面了。然后在你要显示到屏幕上的时候再使用MoveWindow()。当然也可以使用CENTERWINDOW()等函数。
      

  25.   

    To zj510(周):啊?说的详细一些好吗?你是不是已经实现出来了?谢谢。
      

  26.   

    to rchgq(小荷) 重载CDialog的DoModel和RunModalLoop就可以隐藏窗体,但我不知道能不能在initdialog中加上添加土标的代码!!明天我先试试
      

  27.   

    我曾经问过差不多的问题,可以参考!http://www.csdn.net/expert/topic/750/750575.xml?temp=.726391
      

  28.   

    你们已经解决了大部分问题,关键是他希望可以不出现对话框,也不出现一个最小化的对话框,直接隐藏。如果你用sdk,那确实showwindow直接不show就可以了,如果mfc,你就创建一个工具窗口,或者创建完窗口以后,先将属性改为toolwindow,这时候即使显示也没有系统栏上的方框,然后将窗口移走或者最小化。对了,不ShowWindow可不可以?我懒得试了,vc7太慢
      

  29.   

    以下是在 vtable9999(肝肝肝肝) 的那个问题里抄来的
    我试了一下 似乎是可以的//在主窗口的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);
      

  30.   


    下面是jackstraw_lee(稻草人) 的回贴,和我的问题一模一样,看来这个问题不少人碰到过。回复人: jackstraw_lee(稻草人) (  ) 信誉:100  2002-06-11 18:37:00  得分:0  
     
      我试验了好几种方法,目前对话框程序都无法实现启动的时候就进入到托盘,而不显示主界面。现在只能实现主界面先出来,然后通过按钮实现挂到托盘区。如果哪位大侠可以做到启动的时候就可以挂到托盘,麻烦告知如何实现的。
     
     
      

  31.   

    ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW); 
    WINDOWPLACEMENT wp;
    wp.length=sizeof(WINDOWPLACEMENT);
    wp.flags=WPF_RESTORETOMAXIMIZED;
    wp.showCmd=SW_HIDE;
    SetWindowPlacement(&wp);
    我现在就这样做的,很好呀,启动时就没有显示,直接加到托盘,
    我还觉得没有提示不好,自己又加了个无模式对话框的封面,哈哈
      

  32.   

    TO chinaseven(天下第七)
        你的方法没显示图标,程序一启动,我要把图标放到托盘区。
      

  33.   

    to rchgq(小荷):代码已经发出!([email protected])
      

  34.   

    to chinaseven(天下第七) :那种方法不好,它创建一个很小的窗体。重载DoModal和RunModalLoop效果更理想
      

  35.   

    这个我以前就回答过了呀,
    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);
      

  36.   

    kingzai() ,我用了你的方法,确实行得通,却对我原来的程序有一定影响,我的程序是键盘钩子,按某个键的时候它启动某个可执行程序,但用你的方法按键的时候它启动两次相应的可执行程序,要不你再帮我调调谢谢你了。
      

  37.   

    rchgq:我刚才试了一下,原来帮你调过的程序没有问题呀,如果只按一下键,确实只启动一个应用程序的实例。(你可能是按1键的停滞时间过长)
    要保证只有一个应用程序实例,可以用互斥体。
    example:
    CreateMutex(NULL, FALSE, _T("SpyHook"));
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    OnOK();
      

  38.   

    rchgq:我刚才试了一下,原来帮你调过的程序没有问题呀,如果只按一下键,确实只启动一个应用程序的实例。(你可能是按1键的停滞时间过长)
    要保证只有一个应用程序实例,可以用互斥体。
    example:
    CreateMutex(NULL, FALSE, _T("SpyHook"));
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    OnOK();
      

  39.   

    kingzai()
    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);
    一启动真的能最小化到托盘区,但左击鼠标按键时,图标消失同时对话框也不会显示出来了。
      

  40.   

    首先实现托盘图标
    //在主窗口的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
      

  41.   

    大家来看一看这个:
    http://www.csdn.net/expert/topic/799/799900.xml?temp=3.342837E-02
      

  42.   

    chinaseven(天下第七)
    您的方法管用,对话框确实隐藏了,但我不知道怎样才能使恢复显示,象一般的非对话框程序那样,在自定义消息处理函数中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);
      

  43.   

    我的办法,一定可以.首先将最小化到任务栏状态区的代码写到OnSysCommand中:
    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
      

  44.   

    这个问题我也搞了很久,最后找到两种方法可以实现:
    1、(不太好)先添加托盘图标(顶楼方法),然后在OnInitDialog中SetTimer(0,500,NULL),然后在OnTimer中ShowWindow(SW_HIDE)就可以了,不过你可以看到对话框在屏幕上闪了一下。
    2、(效果很好)不要在APP中DoModal对话框,而是在APP中创建一个线程,在线程中把对话框Create出来,在Create后,ShowWindow(SW_HIDE),就可以了,托盘图标不管你在哪里实现都行(不是主要问题)。
      

  45.   

    to sky(张小峰) 你的第二种方法比较特别,能不能跟我们详细讲讲你是怎么实现的。
      

  46.   

    慢慢看吧
    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
    }