使运行的窗口不在任务栏显示

转自:http://www.plm.hk/phpgm/archiver/tid-2457.html

 

jean 发表于 2009-10-23 05:16

使运行的窗口不在任务栏显示

使运行的窗口不在任务栏显示

SetWindowLong(Application->Handle,
              GWL_EXSTYLE,
              (GetWindowLong(Application->Handle,
                             GWL_EXSTYLE)&(~WS_EX_APPWINDOW))|WS_EX_TOOLWINDOW);

///////////////////////////////////////////////////////////
我现在想在一运行我的程序时,就实现如何功能:
1  若任务栏没隐藏,就执行隐藏命令;
2  若已隐藏,则不作任何操作.
请问应该如何写此代码?

HWND hWnd=FindWindow("Shell_TrayWnd",NULL);
if (!IsWindowVisible(hWnd))
return;
else
ShowWindow(hWnd, SW_HIDE);
///////////////////////////////////////////////////////////

主要是重载WndProc,
class TForm1 : public TForm
{
__published:        // IDE-managed Components
    void __fastcall FormShow(TObject *Sender);
private:        // User declarations
protected:
    void __fastcall WndProc(TMessage& Msg);
public:                // User declarations
    __fastcall TForm1(TComponent* Owner);
};

//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//-------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage& Msg)
{
    if (Msg.Msg==WM_SYSCOMMAND && (Msg.WParam&
        0xFFF0)==SC_ICON) {
        Msg.Result = 0;
        WindowState = wsMinimized;
    }
    else
        TForm::WndProc(Msg);
}
//---------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
    ShowWindow(Application->Handle, SW_HIDE);
}

原理是:在用BCB写的程序中,其实VCL自动创建了一个你看不见的窗口作为程序的主窗口(从SDK角度看)。而你自己设定的主窗口,实际上并不是程序的主窗口。所以说,在任务栏显示的,是VCL自动创建的那个窗口,所以要让它不在任务栏显示,就需要在程序的VCL的主窗口显示后,将那个真正的主窗口隐藏就可以了,就是在FormShow里调用ShowWindow(Application->Handle,SW_HIDE);但是仅仅这样做还不行。因为当用户执行VCL的主窗口的系统菜单时,VCL会拦截处理这些系统消息。当用户按最小化按钮时,VCL会自动将这个消息传给那个看不到的真正的主窗口,同时显示那个主窗口,所以还需要在VCL的主窗口里拦截最小化消息,不让VCL处理这个消息。这样就完全达到了不在任务栏显示窗口的目的。

////////////////////////////下边的不对,但可以参考//////
这样的调用这个api函数

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   SetWindowLong(Application->Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
}
////////////////////////////////////////////////////////
API函数:Shell_NOtifyIcon()
    function Shell_NotifyIcon(dwMessage:DWORD;lpData:PNotifyIconData):BOOL; stdcall;
其中dwMessage的值:
NIM_ADD        0             将一个图标加任务栏
NIM_MODIFY     1
转自PLM研究,漂亮妹,www.plm.hk

你可能感兴趣的:(C/C++)