转自: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