非住窗口对话框,如何显示在任务栏

HELLO_wallace 2008-04-16 02:19:02
类似QQ那种,如果要让每个聊天窗口都出现在任务栏上该怎么办?
是不是要建新线程?
...全文
176 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
古月无华 2008-09-11
唉,用8楼的,怎么关闭主程序啊!!!父窗口指针为空了,如何来发消息给主窗口?
回复
你确定传的hwnd正确吗?
回复
我不知道你具体怎么做的,我用这个函数可以将自己的程序的每个子窗口都在任务栏上显示一个图标,而且这些子窗口都是类似QQ那样的无标题栏的窗口,我这些子窗口其父窗口为NULL。


如下面这种用法,我在SDI窗口中用如下方法显示一个非模态的子窗口,这个子窗口里面有一个选项就是隐藏主窗口,

void CSnooperApp::OnMakeTransparent( void )
{
if( !g____maketransparent )
{
CMakeTransparent *dlg = new CMakeTransparent();

dlg->Create( IDD_MAKE_TRANSPARENT, NULL );
dlg->ShowWindow( SW_SHOW );
}
else
{
HWND w0 = ::FindWindow( NULL, "Make transparent" );
if( w0 )
{
::SendMessage( w0, WM_CLOSE, 0, 0 );
}
}
}


//隐藏主窗口
void
CAssembly::OnHideMain( void )
{
showmainwindow( this, m_alreadyhide );
m_alreadyhide = !m_alreadyhide;
}


showmainwindow这个函数就是隐藏主窗口,并将子窗口在任务栏上加一个。

void
showmainwindow( CWnd *pWnd, int bshow )
{
::ShowWindow( g____MainFrame, bshow );
if( pWnd )
{
showintaskbar( pWnd->GetSafeHwnd(), !bshow );
}
}


回复
zhoujianhei 2008-04-17
WS_OVERLAPPEDWINDOW
回复
cnzdgs 2008-04-17
不用怎么麻烦,关键是对话框不能有父窗口。可以在对话框创建后用SetWindowLong来把父窗口句柄设置为NULL;或者在创建对话框之前把theApp.pMainWnd改成NULL,创建完后再改回来。
回复
Kudeet 2008-04-17
更改窗口图标并将其显示在任务栏

以下两个函数可以为应用程序中的各子窗口显示一个任务条到任务栏并更改它们的图标。对那些象QQ一样隐藏主窗口的应用程序特别有用。


//函数用途:更改一个窗口的图标并将其显示在任务栏、任务切换条、任务管理器里
//参数说明:
//hWnd 要改变图标的窗口句柄
//hLargeIcon 显示到任务切换条上的图标 32*32
//hSmallIcon 显示到除任务切换条之外的图标 16*16
//hIcon 显示的图标,32*32,在显示到任务切换条之外的其余地方时会被自动压缩成16*16的。
//注释:
//此函数对于模式对话框无能为力。
//如果HICON 为NULL,函数不改变窗口图标,但是将原有图标显示到任务栏、
// 任务切换条、任务管理器里。
//此函数是通过将窗口的父窗口指针置空来实现将图标显示到任务栏、任务切换条、
// 任务管理器里的,所以调用完成后,其父窗口指针不再可用。
BOOL SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon);
BOOL SendWndIconToTaskbar(HWND hWnd,HICON hIcon);

BOOL CUIApp::SendWndIconToTaskbar(HWND hWnd,HICON hLargeIcon,HICON hSmallIcon)
{
 BOOL ret = TRUE;
 ASSERT(hWnd);
 if(!::IsWindow(hWnd))
  return FALSE;
 //获取窗口指针
 CWnd* pWnd;
 pWnd = pWnd->FromHandle(hWnd);
 ASSERT(pWnd);
 if(!pWnd)
  return FALSE;
 //将父窗口设为NULL
 if(pWnd->GetParent())
  if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) == 0)
   return FALSE;

  if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))
   ret = FALSE;
  //设置窗口图标
  if(hLargeIcon && hSmallIcon)
  {
   pWnd->SetIcon(hSmallIcon,FALSE);
   pWnd->SetIcon(hLargeIcon,TRUE);
  }

  return ret;
 }

BOOL CUIApp::SendWndIconToTaskbar(HWND hWnd,HICON hIcon)
{
 BOOL ret = TRUE;
 ASSERT(hWnd);
 if(!::IsWindow(hWnd))
  return FALSE;
  //获取窗口指针
 CWnd* pWnd;
 pWnd = pWnd->FromHandle(hWnd);
 ASSERT(pWnd);
 if(!pWnd)
  return FALSE;
 //将父窗口设为NULL
 if(pWnd->GetParent())
  if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) == 0)
   return FALSE;

 if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))
  ret = FALSE;
 //设置窗口图标
 pWnd->SetIcon(hIcon,TRUE);
 pWnd->SetIcon(hIcon,FALSE);

 return ret;
}
回复
HELLO_wallace 2008-04-17
谢谢师兄!
我在显示在任务栏以后,想点击关闭以后删除在任务栏上的显示
于是:
我在构造函数中让bShow = TRUE;
在析构函数中让bShow = FALSE;然后再调用showintaskbar,不能删除任务栏上的任务
然后我把设置成全局变量pTaskbarList在该对话框的DestroyWindow里直接使pTaskbarList->DeleteTab( hwnd );
还是达不到效果,我怎么样才能取消呢?
回复
Mr-Chen 2008-04-17
use SetWindowLong
回复
在窗口的onclose里面关闭就可以了。
回复
HELLO_wallace 2008-04-17
我传的 hwnd是正确的 ,关闭还是没发现怎么解决。
8楼的方法要简单些。。。。采用8楼的了,谢谢各位!
回复
#ifndef __TASKBAR_H__
#define __TASKBAR_H__


#ifndef __ITaskbarList_INTERFACE_DEFINED__
#define __ITaskbarList_INTERFACE_DEFINED__

/* interface ITaskbarList */
/* [object][uuid] */


EXTERN_C const IID IID_ITaskbarList;

#if defined(__cplusplus) && !defined(CINTERFACE)

MIDL_INTERFACE("56FDF342-FD6D-11d0-958A-006097C9A090")
ITaskbarList : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE HrInit( void) = 0;

virtual HRESULT STDMETHODCALLTYPE AddTab(
/* [in] */ HWND hwnd) = 0;

virtual HRESULT STDMETHODCALLTYPE DeleteTab(
/* [in] */ HWND hwnd) = 0;

virtual HRESULT STDMETHODCALLTYPE ActivateTab(
/* [in] */ HWND hwnd) = 0;

virtual HRESULT STDMETHODCALLTYPE SetActiveAlt(
/* [in] */ HWND hwnd) = 0;

};

#else /* C style interface */

typedef struct ITaskbarListVtbl
{
BEGIN_INTERFACE

HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
ITaskbarList * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void **ppvObject);

ULONG ( STDMETHODCALLTYPE *AddRef )(
ITaskbarList * This);

ULONG ( STDMETHODCALLTYPE *Release )(
ITaskbarList * This);

HRESULT ( STDMETHODCALLTYPE *HrInit )(
ITaskbarList * This);

HRESULT ( STDMETHODCALLTYPE *AddTab )(
ITaskbarList * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *DeleteTab )(
ITaskbarList * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *ActivateTab )(
ITaskbarList * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *SetActiveAlt )(
ITaskbarList * This,
/* [in] */ HWND hwnd);

END_INTERFACE
} ITaskbarListVtbl;

interface ITaskbarList
{
CONST_VTBL struct ITaskbarListVtbl *lpVtbl;
};



#ifdef COBJMACROS


#define ITaskbarList_QueryInterface(This,riid,ppvObject) \
(This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define ITaskbarList_AddRef(This) \
(This)->lpVtbl -> AddRef(This)

#define ITaskbarList_Release(This) \
(This)->lpVtbl -> Release(This)


#define ITaskbarList_HrInit(This) \
(This)->lpVtbl -> HrInit(This)

#define ITaskbarList_AddTab(This,hwnd) \
(This)->lpVtbl -> AddTab(This,hwnd)

#define ITaskbarList_DeleteTab(This,hwnd) \
(This)->lpVtbl -> DeleteTab(This,hwnd)

#define ITaskbarList_ActivateTab(This,hwnd) \
(This)->lpVtbl -> ActivateTab(This,hwnd)

#define ITaskbarList_SetActiveAlt(This,hwnd) \
(This)->lpVtbl -> SetActiveAlt(This,hwnd)

#endif /* COBJMACROS */


#endif /* C style interface */



HRESULT STDMETHODCALLTYPE ITaskbarList_HrInit_Proxy(
ITaskbarList * This);


void __RPC_STUB ITaskbarList_HrInit_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);


HRESULT STDMETHODCALLTYPE ITaskbarList_AddTab_Proxy(
ITaskbarList * This,
/* [in] */ HWND hwnd);


void __RPC_STUB ITaskbarList_AddTab_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);


HRESULT STDMETHODCALLTYPE ITaskbarList_DeleteTab_Proxy(
ITaskbarList * This,
/* [in] */ HWND hwnd);


void __RPC_STUB ITaskbarList_DeleteTab_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);


HRESULT STDMETHODCALLTYPE ITaskbarList_ActivateTab_Proxy(
ITaskbarList * This,
/* [in] */ HWND hwnd);


void __RPC_STUB ITaskbarList_ActivateTab_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);


HRESULT STDMETHODCALLTYPE ITaskbarList_SetActiveAlt_Proxy(
ITaskbarList * This,
/* [in] */ HWND hwnd);


void __RPC_STUB ITaskbarList_SetActiveAlt_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);



#endif /* __ITaskbarList_INTERFACE_DEFINED__ */


#ifndef __ITaskbarList2_INTERFACE_DEFINED__
#define __ITaskbarList2_INTERFACE_DEFINED__

/* interface ITaskbarList2 */
/* [object][uuid] */


EXTERN_C const IID IID_ITaskbarList2;

#if defined(__cplusplus) && !defined(CINTERFACE)

MIDL_INTERFACE("602D4995-B13A-429b-A66E-1935E44F4317")
ITaskbarList2 : public ITaskbarList
{
public:
virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(
/* [in] */ HWND hwnd,
/* [in] */ BOOL fFullscreen) = 0;

};

#else /* C style interface */

typedef struct ITaskbarList2Vtbl
{
BEGIN_INTERFACE

HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
ITaskbarList2 * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void **ppvObject);

ULONG ( STDMETHODCALLTYPE *AddRef )(
ITaskbarList2 * This);

ULONG ( STDMETHODCALLTYPE *Release )(
ITaskbarList2 * This);

HRESULT ( STDMETHODCALLTYPE *HrInit )(
ITaskbarList2 * This);

HRESULT ( STDMETHODCALLTYPE *AddTab )(
ITaskbarList2 * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *DeleteTab )(
ITaskbarList2 * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *ActivateTab )(
ITaskbarList2 * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *SetActiveAlt )(
ITaskbarList2 * This,
/* [in] */ HWND hwnd);

HRESULT ( STDMETHODCALLTYPE *MarkFullscreenWindow )(
ITaskbarList2 * This,
/* [in] */ HWND hwnd,
/* [in] */ BOOL fFullscreen);

END_INTERFACE
} ITaskbarList2Vtbl;

interface ITaskbarList2
{
CONST_VTBL struct ITaskbarList2Vtbl *lpVtbl;
};



#ifdef COBJMACROS


#define ITaskbarList2_QueryInterface(This,riid,ppvObject) \
(This)->lpVtbl -> QueryInterface(This,riid,ppvObject)

#define ITaskbarList2_AddRef(This) \
(This)->lpVtbl -> AddRef(This)

#define ITaskbarList2_Release(This) \
(This)->lpVtbl -> Release(This)


#define ITaskbarList2_HrInit(This) \
(This)->lpVtbl -> HrInit(This)

#define ITaskbarList2_AddTab(This,hwnd) \
(This)->lpVtbl -> AddTab(This,hwnd)

#define ITaskbarList2_DeleteTab(This,hwnd) \
(This)->lpVtbl -> DeleteTab(This,hwnd)

#define ITaskbarList2_ActivateTab(This,hwnd) \
(This)->lpVtbl -> ActivateTab(This,hwnd)

#define ITaskbarList2_SetActiveAlt(This,hwnd) \
(This)->lpVtbl -> SetActiveAlt(This,hwnd)


#define ITaskbarList2_MarkFullscreenWindow(This,hwnd,fFullscreen) \
(This)->lpVtbl -> MarkFullscreenWindow(This,hwnd,fFullscreen)

#endif /* COBJMACROS */


#endif /* C style interface */

HRESULT STDMETHODCALLTYPE ITaskbarList2_MarkFullscreenWindow_Proxy(
ITaskbarList2 * This,
/* [in] */ HWND hwnd,
/* [in] */ BOOL fFullscreen);


void __RPC_STUB ITaskbarList2_MarkFullscreenWindow_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);



#endif /* __ITaskbarList2_INTERFACE_DEFINED__ */


#endif



//包含这个头文件。
回复
void
showintaskbar( HWND hwnd, int bshow )
{
HRESULT hr;
ITaskbarList* pTaskbarList;

hr = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, ( void** )&pTaskbarList );

pTaskbarList->HrInit( );

if( bshow )
{
pTaskbarList->AddTab( hwnd );
}
else
{
pTaskbarList->DeleteTab( hwnd );
}

pTaskbarList->Release();
}


回复
不用,有一个专门的函数可以做到。

回复
HELLO_wallace 2008-04-16
莫非QQ聊天对话框是单独的程序?
在主程序里CreateProcess?
回复
HELLO_wallace 2008-04-16
谁能指导一下啊,加分了!
回复
HELLO_wallace 2008-04-16
顶上去!
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-16 02:19
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……