请教一个VB对任务栏处理的问题

发财蛇 2003-10-17 10:35:45
VB能否将任务栏中的窗口隐藏掉,不是本身的程序,而是目前正在运行中的其它外部程序。
...全文
137 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hisofty 2003-10-18
  • 打赏
  • 举报
回复
看如下文章:


VB的ShowInTaskbar功能分析以及用VC的实现

在VB中想要显示或隐藏一个窗口在任务栏上的按钮很容易,直接设定一个form的ShowInTabkbar属性即可。但在SDK中却不是一件易事,一个窗口在什么情况下会在任务栏上显示一个按钮,在什么情况下不显示呢?这是有规定的:

0,无论什么情况,要让一个窗口在任务栏上显示按钮的前提是该窗口是可见的.

1.如果一个窗口是顶级窗口(也就是父窗口为NULL,也就是父窗口为桌面窗口),那么Windows将为它在任务栏上创建一个按钮.(有例外,见3)

2.如果一个窗口不是顶级窗口,但有WS_EX_APPWINDOW风格,那么Windows将为它在任务栏上创建一个按钮,否则不会有相应的任务栏按钮.

3.如果一个窗口是顶级窗口,但加了WS_EX_TOOLWINDOW,并去掉WS_EX_APPWINDOW风格,那么Windows不会为它在任务栏上创建一个按钮.

4....

  知道了这些规则,你就能随心所欲的控制你的窗口是否要ShowInTaskbar了,下面给出一个问题和解决方案.

问题:在MFC中一个基于对话框的工程,想要主对话框不在任务栏上显示按钮,该如何做?

解决方案1:

根椐上面的第三条规则,给该对话框加上WS_EX_TOOLWINDOW风格并去掉WS_EX_APPWINDOW风格.

代码:

在对话框类的OnInitDialog函数里加入:
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,SWP_FRAMECHANGED);


备注:这种方法会有一个缺点,你的对话框的标题将会是一个小标题,所以大多数人不会采用这种方法.

解决方案2:

根椐上面的第二条规则,将该对话框变为非顶级窗口并去掉WS_EX_APPWINDOW,在app类的initinstance里的主对话框domodal之前生成一个隐藏的对话框,并将这个窗口的指针保存在CWinApp类的m_pMainWnd成员变量中,以后DoModal的对话框都将是它的子窗口.


代码:

在app的initinstance函数中加入以下加注释的代码
BOOL CTestDlgApp::InitInstance()
{
  ...
  CFrameWnd mainWnd; //生成一个框架窗口对象
  mainWnd.Create(NULL,"aa");//生成窗口,不带ws_visible,也就是说不会显示出来

  CTestDlgDlg dlg;
  m_pMainWnd = &mainWnd;//将这个隐藏窗口设为主窗口

  int nResponse = dlg.DoModal();
  ...
}

在对话框的OnInitDialog里加入 ModifyStyleEx(WS_EX_APPWINDOW,0);以便出掉WS_EX_APPWINDOW。

备注:这种方法较为麻烦,不过很实用,据我观察,C++Builder和Delphi生成的程序都应该有一个隐藏的窗口.


解决方案3:

在IE版本为4.0以上的系统中有一个叫ITaskbarList的接口,故名思义,这个接口可用来控制任务栏上的按钮是否显示,你只要给出一个窗口的句柄和是否显示,完全不需考虑上面那此乱七八糟的规则.

代码:

void ShowInTaskbar(HWND m_hWnd,BOOL bshow)
{
//在app的InitInstance中加入::CoInitialize(NULL);
HRESULT hr;
ITaskbarList *pTaskbarList;

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

pTaskbarList->HrInit();//MSDN中说在使用这个接口的其它方法之前得调用这个方法以便做一些初始化动作,我发现不调用这个方法也可以的.
if(bshow){
pTaskbarList->AddTab(m_hWnd);
}
else{
pTaskbarList->DeleteTab(m_hWnd);
}
pTaskbarList->Release();
//在app的ExitInstance中加入::CoUninitialize();

}


在需要的时候调用这个函数就可以了,第一个参数为窗口的句柄,第二个参数指明是在任务栏上是否显示按钮.

备注:这种方法功能强大,使用也较为简便,不过低版本的windows可能不支持.

以上三种方案大家可根据情况自行选择.

kingcom_xu(原作)
goodname008 2003-10-17
  • 打赏
  • 举报
回复
' 在任务栏中隐藏,在XP下测试通过。

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Const SW_HIDE = 0
Private Const SW_SHOW = 5

Private Sub Command1_Click()
Dim Handle As Long
Handle = FindWindow("Shell_TrayWnd", vbNullString)
Handle = FindWindowEx(Handle, 0&, "ReBarWindow32", vbNullString)
Handle = FindWindowEx(Handle, 0&, "MSTaskSwWClass", "运行应用程序")
Handle = FindWindowEx(Handle, 0&, "ToolbarWindow32", "运行应用程序")
ShowWindow Handle, SW_SHOW
End Sub


http://www.800down.com/view.asp?id=1412
到这里下载一个窗口间谍,会有帮助。
rainstormmaster 2003-10-17
  • 打赏
  • 举报
回复
mark
发财蛇 2003-10-17
  • 打赏
  • 举报
回复
ding~

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧