我们平时做的程序如果在任务栏中隐藏,并且在状态栏中不显示~~
在托管图标中加入你的程序图标和处理消息~~~
当程序不可见时,ctrl+alt+del中的应用程序没有你的程序~~
当程序可见时,ctrl+alt+del中有你的程序,但此时状态栏中却有了你的程序~~~有种做法是~~让你的程序(窗体)成为一个扩展风格为WS_EX_TOOLWIDOW的不可见的窗口的子窗口~~并且你的窗口扩展风格要为
WS_EX_APPWINDOW~~。。
这样做我没试过~~或许可以达到QQ那种效果~~~就是隐藏时,只有托管图标~~ctrl+alt+del中没有你的程序~~
当程序可见时,任务栏还是没有你的程序,但ctrl+alt+del中有了你的程序~~~~!
或许这样很绕~~~
QQ的程序确实有一个不可见的父窗口~~在(0,0)-(6,6)的位置~~~但是这个父类却没有WS_EX_TOOLWIDOW这个属性~~
所以我现在很困惑~~
QQ到底是如何实现的呢?
哦对。。还想起来了~~WINAPI提供了一个IToolbar的COM接口~~我还没用过~~
不晓得这个接口会不会达到QQ那种效果~~

解决方案 »

  1.   

    有些话写错了~~更新如下:
    我们平时做的程序如果在任务栏中隐藏,并且在状态栏中显示~~
    在托管图标(状态栏)中加入你的程序图标和处理消息~~~
    当程序不可见时,ctrl+alt+del中的应用程序没有你的程序,alt+tab也没有~~
    当程序可见时,ctrl+alt+del中有你的程序,alt+tab也有,但此时任务栏中却显示了你的程序~~~如果直接将程序设置成在任务栏不可见,改扩展风格为WS_EX_TOOLWIDOW~~那样。。无论可见与否~~alt+tab都没有你的程序有种做法是~~让你的程序(窗体)成为一个扩展风格为WS_EX_TOOLWIDOW的不可见的窗口的子窗口~~并且你的窗口扩展风格要为
    WS_EX_APPWINDOW~~。。
    这样做我没试过~~或许可以达到QQ那种效果~~~就是隐藏时,只有托管图标~~ctrl+alt+del和alt+tab中没有你的程序~~
    当程序可见时,任务栏还是没有你的程序,但ctrl+alt+del和alt+tab中有你的程序~~~~!
    或许这样很绕~~~
    QQ的程序确实有一个不可见的父窗口~~在(0,0)-(6,6)的位置~~~但是这个父类却没有WS_EX_TOOLWIDOW这个属性~~
    所以我现在很困惑~~
    QQ到底是如何实现的呢?
    哦对。。还想起来了~~WINDOWS提供了一个IToolbar的COM接口~~我还没用过~~
    不晓得这个接口会不会达到QQ那种效果~~
      

  2.   

    其实那个隐藏窗口就是作为隐藏任务栏用的,我也是这么做的,效果还不错,如果仅仅使用WS_EX_TOOLWIDOW
    会有bug的,就是窗口会被置为非激活状态导致,可能就是因为WS_EX_TOOLWIDOW的缘故吧
    VC知识库上面有个文章就是讲的这个
      

  3.   

    WM_APPWINDOW很简单的, 没什么特别的啊
      

  4.   

    隐藏窗口就不会在任务栏上显示啊,然后你的窗口以这个窗口为父窗口,去掉WS_EX_APPWINDOW就可以了
      

  5.   

    现在我在我的窗口main入口处创建了一个隐藏不可见的窗口的进程~~
    在WM_CREATE中设置成为我的窗口~~但是问题是~~~我对我的子窗口的自定义消息~~就是自定义任务栏处的消息~~子窗口根本无法接受~~
    我如何让我子窗口的消息和父窗口的消息独立开来呢??
      

  6.   

    呵呵呵呵太囧了,关隐藏窗口什么事情啊,晕ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);试试
      

  7.   

    你的那个ModifyStyleEx我试过了~~~不得行~~~
      

  8.   

    QQ主界面的所有者是一个没有WS_VISIBLE属性的窗口。这样QQ就可以再任务栏中隐藏了,而且alt+tab键的窗口选择栏中有该程序。
      

  9.   

    QQ的父窗口是非隐藏的的~~~(0,0-(6,6)~~~只是没有WS_VISABLE或者是WS_VISABLE的属性~~~
    如果父窗口和子窗口是两个进程~~~
    现在问题是如何让我子窗口的消息和父窗口的消息独立开呢~~~
    否则我子窗口的消息根本无法响应~
      

  10.   

    用ITaskbarList接口隐藏任务栏图标 CoInitialize(NULL);
    ITaskbarList* plist=NULL;
    HRESULT hr=CoCreateInstance         (CLSID_TaskbarList,NULL,CLSCTX_ALL,IID_ITaskbarList,(PVOID*)&plist);
    hr=plist->HrInit();
    hr=plist->DeleteTab(this->GetSafeHwnd());
    plist->Release();
    CoUninitialize();
      

  11.   

    使用 CAppBar就可以了 
      

  12.   

    [转自] http://www.vckbase.com/document/viewdoc/?id=430  中的第10的问题先从CWinApp继承类中建立一个不显示的顶级窗口. CFrameWnd *abc=new CFrameWnd();
    abc->Create(0,0,WS_OVERLAPPEDWINDOW);
    CNoTaskBarIconDlg dlg(abc);
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    }
    else if (nResponse == IDCANCEL)
    {
    }
    delete abc;
    在 OnInitDialog中修改显示风格 WS_EX_APPWINDOW.BOOL CNoTaskBarIconDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
        ModifyStyleEx(WS_EX_APPWINDOW,0);    SetIcon(m_hIcon, TRUE);  // Set big icon
        SetIcon(m_hIcon, FALSE); // Set small icon

        // TODO: Add extra initialization here

        return TRUE;  // return TRUE  unless you set the focus to a control
    }本人测试过!! 效果跟QQ一样儿, 只是按Alt + Tab键时出现的窗口中没有正常显示程序本身的图标, 你可以试试!!!
      

  13.   

    设置CFrameWnd*abc的图标,就可以在按下Alt+Tab组合键时正常显示程序图标。
      

  14.   

    感谢大家这么积极哈~~~
    #20楼的兄弟方法我试过了~~
    是可以达到QQ的效果~~~
    我用API也是这样做的~~~
    在winmain里注册两个窗口类~~
    第一个做为父窗口~~第二个做为子窗口~~
    父窗口的样式是不可用~~~但是可见只有(0,0)-(6,6)的大小~~~并且他的父窗口是桌面,且一直在Z序底层~~
    当创建好了~~我再创建我的子窗口~~用我刚建立的窗口作为父窗口~~~前提,两个窗口有不同的窗口过程~~~
    达到了同样的效果~~
    但是大家可以用SPY++看下QQ的~~~QQ的父窗口的进程和子窗口进程是两个不同的进程~~~
    所以我就纳闷了~~
    如果不是同一个进程~~~那应该是在创建父窗口的时候~~子窗口是作为子进程创建的~~
    但是如果是这样~~那子窗口的消息该如何响应???他要先传给父窗口~~父窗口再传给子窗口~~
    怎么样可以让他们俩独立开呢???
      

  15.   

    大家给的MFC方法和我的API方法都是对的~~~
    我看错了~~~
    VS2005翻译的把window procedure翻译成窗口进程了~~
    我就以为是两个进程了~~
    是窗口过程~~
    呵呵问题OK了。结贴了~~!!