首先,請(qǐng)看看這些術(shù)語。系統(tǒng)托盤是一個(gè)在任務(wù)條右角的小方框,在托盤了應(yīng)用程序可以顯示小圖標(biāo) 。任務(wù)條是可以在屏幕上伸展的工具欄。它就是程序圖標(biāo)所在的位置。想隱藏程序的任務(wù)條圖標(biāo),你可以應(yīng)用ShowWindow函數(shù)并傳給它Application->Handle窗口句柄。
ShowWindow(Application->Handle, SW_HIDE);
若想讓任務(wù)條圖標(biāo)再出現(xiàn),只需將SW_HIDE改為SW_SHOW。
ShowWindow(Application->Handle, SW_SHOW);
注: 你可以設(shè)置主窗口的Visible屬性為false來隱藏它。
注: 通過ShowWindow來隱藏窗口的任務(wù)條圖標(biāo)是不持久的。某些動(dòng)作會(huì)使任務(wù)條圖標(biāo)重現(xiàn)。你可以將隱藏的應(yīng)用程序窗口設(shè)為Tool Window來移走程序的任務(wù)條圖標(biāo)而避免它再次出現(xiàn)。Tool Windows永遠(yuǎn)不會(huì)有任務(wù)條圖標(biāo)。 使應(yīng)用程序窗口成為一個(gè)Tool Window有一個(gè)副作用:當(dāng)用戶按下Alt-TAB時(shí)它將不在程序列表中出現(xiàn)。你可以調(diào)用API函數(shù)GetWindowLong和SetWindowLong來使應(yīng)用程序窗口成為一個(gè)Tool Window。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE); dwExStyle |= WS_EX_TOOLWINDOW; SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);
try {
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
} catch (Exception &exception) {
Application->ShowException(&exception);
}
return 0;
}
注:程序啟動(dòng)后要隱藏主窗體,則可以在WinMain中添加如下代碼:(Project->View Scource)
ShowWindow(Application->Handle,SW_HIDE);
Application->ShowMainForm=false;
當(dāng)你想顯示程序時(shí)執(zhí)行下面這兩行代碼:(記住,如果代碼定位在主窗口類的一個(gè)方法中,Application->MainForm->Visible=true可以用Visible=true 來代替。)
ShowWindow(Application->Handle, SW_SHOW);
Application->MainForm->Visible = true;
發(fā)送電子郵件
2000年第一期的《電腦報(bào)》刊登了題目為《自己動(dòng)手編寫電子郵件軟件》的文章,文章講述了如何用VB編寫一個(gè)簡(jiǎn)單的電子郵件發(fā)送程序。其實(shí),如果你是一個(gè)C++Builder愛好者,完全可以更快、更簡(jiǎn)捷地編寫出這類軟件。請(qǐng)聽我下文分解:
與E-mail密切相關(guān)的兩個(gè)協(xié)議是POP3和SMTP,POP3是Post Protocol 3的縮寫,用于從POP3服務(wù)器接收電子郵件,SMTP是Simple Mail Transfer Protocol的縮寫,用于通過SMTP服務(wù)器發(fā)送電子郵件。這兩個(gè)協(xié)議本身是很復(fù)雜的,但C++Builder從NetManage公司引進(jìn)了POP、SMTP控件,這樣,我們完全可以不去管那些收發(fā)郵件的機(jī)理,只要設(shè)置好這些控件就可以編出一個(gè)C++Builder的發(fā)送郵件程序了。下面介紹SMTP控件:
SMTP控件位于控件欄的Internet頁面上,名稱為:NMSMTP。SMTP的主要屬性有:
Host屬性,用來指定SMTP服務(wù)器的主機(jī)名。
Port屬性,用于指定SMTP服務(wù)器的端口號(hào),一般設(shè)為25。
UserId屬性,登錄SMTP服務(wù)器時(shí)用于設(shè)置用戶名。
PostMessage屬性,此屬性非常重要,從以下它的內(nèi)容你就可以看出來了:
FromName 用于指定發(fā)件人的名稱。
FromAddress 用于指定發(fā)件人的e-mail地址。
LocalProgram 用于指定發(fā)件人所使用的郵件客戶程序。
ToAddress 收件人的地址。
Body 郵件正文。
Subject 郵件主題。
SMTP控件的方法:
Connect函數(shù),用于登錄到SMTP服務(wù)器,使用此函數(shù)前,Host、Port、UserId等屬性必須已設(shè)好。
Disconnect函數(shù),用于斷開與SMTP服務(wù)器的連接。
SendMail函數(shù),用于向SMTP服務(wù)器發(fā)送郵件。知道了這些,我們就可以寫程序了。
新建應(yīng)用程序,將工程名保存為sendmail,在Form1上加入NMSMTP控件,Host屬性添入SMTP服務(wù)器的名稱,如:“smtp.yeah.net”,UserId屬性添入你在此郵箱申請(qǐng)的用戶名,其它屬性保持默認(rèn)值;加入4個(gè)Label控件,將其Caption分別設(shè)為:“發(fā)件人名稱”、“收件人地址”、“郵件主題”和“郵件正文”;加入4個(gè)Edit控件,將其Name分別設(shè)為:“Name1”、“Address1”、“Subject1”和“Body1”;一個(gè)SpeedButton控件,Caption為:“發(fā)送”(以上屬性均不含引號(hào)),Click事件代碼為:
NMSMTP1- >Connect();
NMSMTP1- >PostMessageA->FromName=Name1->Text;
NMSMTP1- >PostMessageA->FromAddress=〃suPerlink@yeah.net〃;
NMSMTP1- >PostMessageA->ToAddress->Add(Address1->Text);
NMSMTP1- >PostMessageA->Subject=Subject1->Text;
NMSMTP1- >PostMessageA->Body->Add(Body1->Text);
NMSMTP1- >PostMessageA->LocalProgram=〃SendMail〃;
NMSMTP1- >SendMail();
Application- >MessageBoxA(〃發(fā)送完成!〃,〃郵件系統(tǒng)〃,MB_OK);
NMSMTP1- >Disconnect();
完成!有人不禁要問:“就這么簡(jiǎn)單?”,的確就這么簡(jiǎn)單。不過,NMSMTP控件還有大量的功能沒在此一一列出,同時(shí)還有NMPOP3控件可用來編寫接收郵件的程序,如果喜愛C++Builder的朋友感興趣,完全可以寫出象OutLook Express、FoxMail這樣的電子郵件軟件。
C++builder編程修改注冊(cè)表的問題
RootKey是注冊(cè)表的根鍵值,比如運(yùn)行regedit后看到的HKEY_USERS,HKEY_LOCAL_MACHINE就是RootKey,在TRegIniFile中缺省的RootKey是HKEY_USERS.
下面的例子是TReGIStry的,TRegIniFile也差不多
void __fastcall TfrmMainForm::WriteToMyRegistry(int table_count)
{
//TODO: Add your source code here
TRegistry *MyRegistry=new TRegistry;
MyRegistry- >RootKey=HKEY_LOCAL_MACHINE; //改變?nèi)笔ootkey
if(!MyRegistry->OpenKey("Software\\Microsoft\\Windows\\Current\Version\\Run",true)) { //打開主鍵
//這樣雙引號(hào)里面的東西就變成了CurrentKey
Application- >MessageBox("注冊(cè)表內(nèi)容無效", "讀取注冊(cè)表出錯(cuò)",MB_ICONERROR);
MyRegistry- >CloseKey();
delete MyRegistry;
return;
}
MyRegistry- >WriteString("myrun","c:\\sthVCd\\sthvcd.exe");
MyRegistry- >CloseKey();
delete MyRegistry;
}
怎樣隱藏應(yīng)用程序不讓它出現(xiàn)在CTRL-ALT-DEL對(duì)話框中
把你的應(yīng)用程序從CTRL-ALT-DEL對(duì)話框中隱藏的一個(gè)簡(jiǎn)單辦法是去應(yīng)用程序的標(biāo)題。如果一個(gè)程序的主窗口沒有標(biāo)題,Windows不把它放到CTRL-ALT-DEL對(duì)話框中。清除標(biāo)題屬性的地方是在WinMain函數(shù)里。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try{
Application->Title = "";
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
另一種方法是:調(diào)用RegisterServiceProcess API 函數(shù)將程序注冊(cè)成為一個(gè)服務(wù)模式程序。 RegisterServiceProcess是一個(gè)在Kernel32.dll里相關(guān)但無正式文件的函數(shù)。在MS SDK頭文件里沒有該函數(shù)的原型說明,但在Borland import libraries for C++ Builder里能找到。很顯然,這個(gè)函數(shù)的主要目的是創(chuàng)建一個(gè)服務(wù)模式程序。之所以說很顯然,是因?yàn)镸SDN里實(shí)質(zhì)上對(duì)這個(gè)函數(shù)沒有說什么。
下面的例子代碼演示了在Windows95/98下怎樣通過使用RegisterServiceProcess來把你的程序從CTRL-ALT-DEL對(duì)話框中隱藏起來。
//------------Header file------------------------------
typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);
class TForm1 : public TForm
{
__published:
TButton *Button1;
private:
HINSTANCE hKernelLib;
pRegFunction RegisterServiceProcess;
public:
__fastcall TForm1(TComponent* Owner);
__fastcall ~TForm1();
};
//-----------CPP file------------------------------
#include "Unit1.h"
#define RSP_SIMPLE_SERVICE 1
#define RSP_UNREGISTER_SERVICE 0
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
hKernelLib = LoadLibrary("kernel32.dll");
if(hKernelLib){
RegisterServiceProcess =(pRegFunction)GetProcAddress(hKernelLib,"RegisterServiceProcess");
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),RSP_SIMPLE_SERVICE);
}
}
__fastcall TForm1::~TForm1()
{
if(hKernelLib){
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),RSP_UNREGISTER_SERVICE);
FreeLibrary(hKernelLib);
}
}
ShowWindow(Application->Handle, SW_HIDE);
若想讓任務(wù)條圖標(biāo)再出現(xiàn),只需將SW_HIDE改為SW_SHOW。
ShowWindow(Application->Handle, SW_SHOW);
注: 你可以設(shè)置主窗口的Visible屬性為false來隱藏它。
注: 通過ShowWindow來隱藏窗口的任務(wù)條圖標(biāo)是不持久的。某些動(dòng)作會(huì)使任務(wù)條圖標(biāo)重現(xiàn)。你可以將隱藏的應(yīng)用程序窗口設(shè)為Tool Window來移走程序的任務(wù)條圖標(biāo)而避免它再次出現(xiàn)。Tool Windows永遠(yuǎn)不會(huì)有任務(wù)條圖標(biāo)。 使應(yīng)用程序窗口成為一個(gè)Tool Window有一個(gè)副作用:當(dāng)用戶按下Alt-TAB時(shí)它將不在程序列表中出現(xiàn)。你可以調(diào)用API函數(shù)GetWindowLong和SetWindowLong來使應(yīng)用程序窗口成為一個(gè)Tool Window。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE); dwExStyle |= WS_EX_TOOLWINDOW; SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);
try {
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
} catch (Exception &exception) {
Application->ShowException(&exception);
}
return 0;
}
注:程序啟動(dòng)后要隱藏主窗體,則可以在WinMain中添加如下代碼:(Project->View Scource)
ShowWindow(Application->Handle,SW_HIDE);
Application->ShowMainForm=false;
當(dāng)你想顯示程序時(shí)執(zhí)行下面這兩行代碼:(記住,如果代碼定位在主窗口類的一個(gè)方法中,Application->MainForm->Visible=true可以用Visible=true 來代替。)
ShowWindow(Application->Handle, SW_SHOW);
Application->MainForm->Visible = true;
發(fā)送電子郵件
2000年第一期的《電腦報(bào)》刊登了題目為《自己動(dòng)手編寫電子郵件軟件》的文章,文章講述了如何用VB編寫一個(gè)簡(jiǎn)單的電子郵件發(fā)送程序。其實(shí),如果你是一個(gè)C++Builder愛好者,完全可以更快、更簡(jiǎn)捷地編寫出這類軟件。請(qǐng)聽我下文分解:
與E-mail密切相關(guān)的兩個(gè)協(xié)議是POP3和SMTP,POP3是Post Protocol 3的縮寫,用于從POP3服務(wù)器接收電子郵件,SMTP是Simple Mail Transfer Protocol的縮寫,用于通過SMTP服務(wù)器發(fā)送電子郵件。這兩個(gè)協(xié)議本身是很復(fù)雜的,但C++Builder從NetManage公司引進(jìn)了POP、SMTP控件,這樣,我們完全可以不去管那些收發(fā)郵件的機(jī)理,只要設(shè)置好這些控件就可以編出一個(gè)C++Builder的發(fā)送郵件程序了。下面介紹SMTP控件:
SMTP控件位于控件欄的Internet頁面上,名稱為:NMSMTP。SMTP的主要屬性有:
Host屬性,用來指定SMTP服務(wù)器的主機(jī)名。
Port屬性,用于指定SMTP服務(wù)器的端口號(hào),一般設(shè)為25。
UserId屬性,登錄SMTP服務(wù)器時(shí)用于設(shè)置用戶名。
PostMessage屬性,此屬性非常重要,從以下它的內(nèi)容你就可以看出來了:
FromName 用于指定發(fā)件人的名稱。
FromAddress 用于指定發(fā)件人的e-mail地址。
LocalProgram 用于指定發(fā)件人所使用的郵件客戶程序。
ToAddress 收件人的地址。
Body 郵件正文。
Subject 郵件主題。
SMTP控件的方法:
Connect函數(shù),用于登錄到SMTP服務(wù)器,使用此函數(shù)前,Host、Port、UserId等屬性必須已設(shè)好。
Disconnect函數(shù),用于斷開與SMTP服務(wù)器的連接。
SendMail函數(shù),用于向SMTP服務(wù)器發(fā)送郵件。知道了這些,我們就可以寫程序了。
新建應(yīng)用程序,將工程名保存為sendmail,在Form1上加入NMSMTP控件,Host屬性添入SMTP服務(wù)器的名稱,如:“smtp.yeah.net”,UserId屬性添入你在此郵箱申請(qǐng)的用戶名,其它屬性保持默認(rèn)值;加入4個(gè)Label控件,將其Caption分別設(shè)為:“發(fā)件人名稱”、“收件人地址”、“郵件主題”和“郵件正文”;加入4個(gè)Edit控件,將其Name分別設(shè)為:“Name1”、“Address1”、“Subject1”和“Body1”;一個(gè)SpeedButton控件,Caption為:“發(fā)送”(以上屬性均不含引號(hào)),Click事件代碼為:
NMSMTP1- >Connect();
NMSMTP1- >PostMessageA->FromName=Name1->Text;
NMSMTP1- >PostMessageA->FromAddress=〃suPerlink@yeah.net〃;
NMSMTP1- >PostMessageA->ToAddress->Add(Address1->Text);
NMSMTP1- >PostMessageA->Subject=Subject1->Text;
NMSMTP1- >PostMessageA->Body->Add(Body1->Text);
NMSMTP1- >PostMessageA->LocalProgram=〃SendMail〃;
NMSMTP1- >SendMail();
Application- >MessageBoxA(〃發(fā)送完成!〃,〃郵件系統(tǒng)〃,MB_OK);
NMSMTP1- >Disconnect();
完成!有人不禁要問:“就這么簡(jiǎn)單?”,的確就這么簡(jiǎn)單。不過,NMSMTP控件還有大量的功能沒在此一一列出,同時(shí)還有NMPOP3控件可用來編寫接收郵件的程序,如果喜愛C++Builder的朋友感興趣,完全可以寫出象OutLook Express、FoxMail這樣的電子郵件軟件。
C++builder編程修改注冊(cè)表的問題
RootKey是注冊(cè)表的根鍵值,比如運(yùn)行regedit后看到的HKEY_USERS,HKEY_LOCAL_MACHINE就是RootKey,在TRegIniFile中缺省的RootKey是HKEY_USERS.
下面的例子是TReGIStry的,TRegIniFile也差不多
void __fastcall TfrmMainForm::WriteToMyRegistry(int table_count)
{
//TODO: Add your source code here
TRegistry *MyRegistry=new TRegistry;
MyRegistry- >RootKey=HKEY_LOCAL_MACHINE; //改變?nèi)笔ootkey
if(!MyRegistry->OpenKey("Software\\Microsoft\\Windows\\Current\Version\\Run",true)) { //打開主鍵
//這樣雙引號(hào)里面的東西就變成了CurrentKey
Application- >MessageBox("注冊(cè)表內(nèi)容無效", "讀取注冊(cè)表出錯(cuò)",MB_ICONERROR);
MyRegistry- >CloseKey();
delete MyRegistry;
return;
}
MyRegistry- >WriteString("myrun","c:\\sthVCd\\sthvcd.exe");
MyRegistry- >CloseKey();
delete MyRegistry;
}
怎樣隱藏應(yīng)用程序不讓它出現(xiàn)在CTRL-ALT-DEL對(duì)話框中
把你的應(yīng)用程序從CTRL-ALT-DEL對(duì)話框中隱藏的一個(gè)簡(jiǎn)單辦法是去應(yīng)用程序的標(biāo)題。如果一個(gè)程序的主窗口沒有標(biāo)題,Windows不把它放到CTRL-ALT-DEL對(duì)話框中。清除標(biāo)題屬性的地方是在WinMain函數(shù)里。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try{
Application->Title = "";
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
另一種方法是:調(diào)用RegisterServiceProcess API 函數(shù)將程序注冊(cè)成為一個(gè)服務(wù)模式程序。 RegisterServiceProcess是一個(gè)在Kernel32.dll里相關(guān)但無正式文件的函數(shù)。在MS SDK頭文件里沒有該函數(shù)的原型說明,但在Borland import libraries for C++ Builder里能找到。很顯然,這個(gè)函數(shù)的主要目的是創(chuàng)建一個(gè)服務(wù)模式程序。之所以說很顯然,是因?yàn)镸SDN里實(shí)質(zhì)上對(duì)這個(gè)函數(shù)沒有說什么。
下面的例子代碼演示了在Windows95/98下怎樣通過使用RegisterServiceProcess來把你的程序從CTRL-ALT-DEL對(duì)話框中隱藏起來。
//------------Header file------------------------------
typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);
class TForm1 : public TForm
{
__published:
TButton *Button1;
private:
HINSTANCE hKernelLib;
pRegFunction RegisterServiceProcess;
public:
__fastcall TForm1(TComponent* Owner);
__fastcall ~TForm1();
};
//-----------CPP file------------------------------
#include "Unit1.h"
#define RSP_SIMPLE_SERVICE 1
#define RSP_UNREGISTER_SERVICE 0
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
hKernelLib = LoadLibrary("kernel32.dll");
if(hKernelLib){
RegisterServiceProcess =(pRegFunction)GetProcAddress(hKernelLib,"RegisterServiceProcess");
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),RSP_SIMPLE_SERVICE);
}
}
__fastcall TForm1::~TForm1()
{
if(hKernelLib){
if(RegisterServiceProcess)
RegisterServiceProcess(GetCurrentProcessId(),RSP_UNREGISTER_SERVICE);
FreeLibrary(hKernelLib);
}
}

