¡ïC++ Builder Chapter 2
¡ô ϵͳ±à³Ì ¡ô
=======================================================================
¡ô À¹½ØWindowsÏûÏ¢
=======================================================================
À¹½ØWindowsÏûÏ¢ÐèÒªÒÔϼ¸²½£º
¡¤ÔÚ±íµ¥Í·ÎļþÄÚ(ÈçUnit1.h)
1. ÔÚÀàÉùÃ÷Öн¨Á¢ÏûÏ¢Ó³Éä±í£¬°ÑijÌõÏûÏ¢µÄ´¦ÀíȨ½»¸ø×Ô¶¨ÒåµÄÏûÏ¢´¦Àíº¯Êý
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WindowsÏûÏ¢Ãû£¬TMessage£¬ÏûÏ¢´¦Àíº¯ÊýÃû)
MESSAGE_HANDLER(...)
END_MESSAGE_MAP£¨TForm£©
2. ÔÚÀàÉùÃ÷µÄprivateÇøÄÚÉùÃ÷ÏûÏ¢´¦Àíº¯Êý¡£
private: // User declarations
void __fastcall ÏûÏ¢´¦Àíº¯ÊýÃû(TMessage &Message)£»
¡¤ÔÚ±íµ¥ÎļþÄÚ£¨ÈçUnit1.cpp£©
3. д³öÏûÏ¢´¦Àíº¯Êý£¬ÔÚÕâÀïʵÏÖÄãÐèÒªµÄ¹¦ÄÜ¡£±ÈÈç
void __fastcall MainForm::OnWMHScroll (TMessage &Message)
{
... // Ôڴ˼ÓÈëÄã×Ô¼ºµÄ´úÂë
TForm::Dispatch(&Message);
}
¡¤½âÊÍ
1. ¹ØÓÚTMessage
TMessageÊÇVCLÔ¤¶¨ÒåµÄ½á¹¹£¬¶¨ÒåÈçÏ£º
struct TMessage
{
unsigned int Msg; //ÏûÏ¢
int WParam; //×Ö²ÎÊý
int LParam; //³¤×Ö²ÎÊý
int Result; //ÏûÏ¢½á¹û
};
2. ¹ØÓÚTForm::Dispatch(&Message)
×Ô¶¨ÒåµÄÏûÏ¢´¦Àíº¯Êýĩβ×îºÃ¼ÓÒ»¾äTForm::Dispatch(&Message)£¬ÕâÒ»¾äµÄ×÷ÓÃÊÇÈÃÏû
Ï¢¼ÌÐø´«µÝÏÂÈ¥¡£Èç¹ûûÓÐÕâÒ»¾ä£¬ÏûÏ¢½«±»ÍêÈ«À¹½Ø£¬VCLÀà¿ÉÄÜÓÉÓڵò»µ½ÏûÏ¢¶øÎÞ·¨
ʵÏÖÕý³£¹¦ÄÜ¡£
Àý£ºÐÞ¸Äϵͳ²Ëµ¥
¡¤¼Ù¶¨±íµ¥ÃûΪMainForm£¬ÉèÖÃMainForm::OnCreate()º¯Êý£º
1. ÓÃGetSystemMenu(MainForm->Handle,false)È¡µÃϵͳ²Ëµ¥¾ä±ú£»
2. ÓÃAppendMenu,DeleteMenu,ModifyMenuº¯ÊýÐÞ¸Äϵͳ²Ëµ¥£¬°ÑеÄIDºÅ¸³ÓÚ×Ô¶¨ÒåµÄ²Ë
µ¥Ïî¡£
ÕâʱÔËÐгÌÐò£¬¿ÉÒÔ¿´µ½ÏµÍ³²Ëµ¥Ò²±»Ð޸쬵«×Ô¶¨ÒåµÄ²Ëµ¥ÏîÈ´²»Äܱ»ÏìÓ¦¡£
¡¤À¹½ØWM_SYSCOMMANDÏûÏ¢ÒÔÏìÓ¦×Ô¶¨ÒåµÄ²Ëµ¥Ïî
ÔÚ±íµ¥Í·ÎļþÄÚ(ÈçUnit1.h)
1. ÔÚ±íµ¥ÀඨÒåĩβ¼ÓÈëÏûÏ¢ÏìÓ¦±í£¬È¡µÃWM_SYSCOMMANDÏûÏ¢µÄ´¦ÀíȨ
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand)
END_MESSAGE_MAP(TForm)
2. ÔÚ±íµ¥ÀඨÒåµÄprivateÇøÄÚ¼ÓÈëÏûÏ¢´¦Àíº¯ÊýÉùÃ÷
private: // User declarations
void __fastcall OnWMSysCommand(TMessage& Message);
3. д³öÏûÏ¢ÏìÓ¦º¯Êý
void __fastcall TForm1::OnWMSysCommand(TMessage& Message)
{
if(Message.WParam==ID_SysMenu_MyItem)
{
// Your Code Here, Do Something
}
TForm::Dispatch(&Message);
}
=======================================================================
¡ô ÈÎÎñÀ¸Í¼±ê ×¢Ò⣺Ôö¼ÓÍ·Îļþ˵Ã÷#include <shellapi.h>
=======================================================================
ͨ¹ýAPI·¢ËÍÏûϢ֪ͨÈÎÎñÀ¸Ôö¼Ó£¬É¾³ý,ºÍÐÞ¸Äͼ±ê¡£·¢ËÍÏûÏ¢±ØÐëµ÷ÓÃShell_NotifyIc
on¡£ÆäÔÐÎΪ£º
¡¡¡¡WINSHELLAPI BOLL WINAPI Shell_NotifyIcon(
¡¡¡¡DWORD dwMessage, POINTIFYCONDATA pnid);
¡¤µÚÒ»¸ö²ÎÊý dwMessageÊÇ·¢ËÍÏûÏ¢µÄ±êÖ¾£¬¿ÉÒÔÑ¡£º
¡¡¡¡NIM_ADD // ÍùÈÎÎñÀ¸Í¨ÖªÇøÌí¼Óͼ±ê
¡¡¡¡NIM_DELETE //ÍùÈÎÎñÀ¸Í¨ÖªÇøÉ¾³ýͼ±ê
¡¡¡¡NIM_MODIFY //֪ͨÈÎÎñÀ¸Í¨ÖªÇøÐÞ¸Äͼ±ê
¡¤µÚ¶þ¸ö²ÎÊý¶¨ÒåÈçÏ£º
typedef struct _NOTIFYICONDATA{
¡¡¡¡DWORD cbSize; //½á¹¹ËùÕ¼µÄ×Ö½ÚÊý£¬±ØÐëÓýṹµÄ´óСÀ´³õʼ»¯¡£
¡¡¡¡HWND hWnd; //½ÓÊÜTrayͼ±êÏûÏ¢µÄ´°¿Ú¾ä±ú
¡¡¡¡UINT uID; //ÓÉÓ¦ÓóÌÐò¶¨ÒåµÄͼ±êID
¡¡¡¡UINT uFlags; //ÓÃÀ´¼ø±ðÄÇЩÐèÒª¸Ä±äÆäÖµµÄÓò£¬NIF_ICON±íʾhIconÓÐЧ£¬¿ÉÓÃÀ´
ÐÞ¸Äͼ±ê£¬NIF_MESSAGE±íʾuCallbackMessageÓÐЧ£¬ÓÃÀ´¶¨ÒåÏûÏ¢£¬NIF_TIP±íʾszTip²Î
ÊýÓÐЧ£¬¿ÉÐ޸Ť¾ßÌáʾ¡£
¡¡¡¡UINT uCallbackMessage; //Ó¦ÓóÌÐò¶¨ÒåµÄÏûÏ¢
¡¡¡¡HICON hIcon; //Trayͼ±êµÄ¾ä±ú
¡¡¡¡char szTip[64]; //¹¤¾ßÌáʾµÄÎı¾
¡¡¡¡}NOTIFYICONDATA;
Àý£º±ä»¯µÄÈÎÎñÀ¸Í¼±ê
Àý£º³ÌÐòÔËÐÐʱÍÐÅÌÇøÏÔʾ
private¶ÎÔö¼ÓһЩÊý¾Ý³ÉÔ±ºÍ·½·¨µÄÉùÃ÷£º
¡¡¡¡unsigned int iconmessage; //¶¨ÒåµÄÏûÏ¢
¡¡¡¡void AddTrayIcon(); //ÔÚÍÐÅÌÉÏÔö¼Óͼ±ê
¡¡¡¡void RemoveTrayIcon(); //´ÓÍÐÅÌÖÐɾ³ýͼ±ê
protected¶ÎÔö¼Ó£º
virtual void _fastcall WndProc(Messages::TMessage &Message);
ÖØÔØ´°¿Ú¹ý³Ìº¯ÊýWndProc
void TForm1::AddTrayIcon()
{
NOTIFYICONDATA icondata;
memset(&icondata,0,sizeof(icondata)); //½«½á¹¹icondataµÄ¸÷Óò³õʼ»¯Îª0
icondata.cbSize=sizeof(icondata);
icondata.hWnd=Handle;
strncpy(icondata.szTip,"δ֪״̬",sizeof(icondata.szTip));
icondata.hIcon=Application->Icon->Handle;
icondata.uCallbackMessage=iconmessage;
icondata.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&icondata);
}
void TForm1::RemoveTrayIcon()
{
NOTIFYICONDATA icondata;
memset(&icondata,0,sizeof(icondata));
icondata.cbSize=sizeof(icondata);
icondata.hWnd=Handle;
Shell_NotifyIcon(NIM_DELETE,&icondata);
}
void __fastcall TForm1::WinProc(TMessage & Message)
{
if(Message.Msg==iconmessage)
{
if(Message.LParam==WM_LBUTTONDBLCLK)
{
Application->Terminate();
}
return;
}
TForm::WndProc(Message); //¶ÔÓÚÆäËûµÄÏûÏ¢£¬µ÷Óûù´¡ÀàµÄWndProcº¯ÊýÈÃWindows½ø
ÐÐȱʡ´¦Àí¡£
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
iconmessage=RegisterWindowMessage("IconNotify");
AddTrayIcon();
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
RemoveTrayIcon(); //´°ÌåÔڹرÕʱɾ³ýÍÐÅÌÖеÄͼ±ê
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
NOTIFYICONDATA icondata;
memset (&icondata, 0, sizeof (icondata));
icondata.cbSize = sizeof (icondata);
icondata.hWnd = Handle;
String s="ÎÒµÄͼ±ê!"; //¶¨ÒåÌáʾÎı¾
strncpy (icondata.szTip, s.c_str(), sizeof (icondata.szTip));
icondata.uFlags = NIF_TIP ;
Shell_NotifyIcon (NIM_MODIFY,&icondata);
}
=======================================================================
¡ô Òþ²ØÓ¦ÓóÌÐòµÄÈÎÎñÌõͼ±ê
=======================================================================
½«Òþ²ØµÄÓ¦ÓóÌÐò´°¿ÚÉèΪTool WindowÀ´ÒÆ×ß³ÌÐòµÄÈÎÎñÌõͼ±ê¶ø±ÜÃâËüÔٴγöÏÖ¡£Too
l windowsÓÀÔ¶²»»áÓÐÈÎÎñÌõͼ±ê¡£ ʹӦÓóÌÐò´°¿Ú³ÉΪһ¸öTool WindowÓÐÒ»¸ö¸±×÷Óãº
µ±Óû§°´ÏÂAlt-TABʱËü½«²»ÔÚ³ÌÐòÁбíÖгöÏÖ¡£µ÷ÓÃAPIº¯ÊýGetWindowLongºÍSetWindow
LongÀ´Ê¹Ó¦ÓóÌÐò´°¿Ú³ÉΪһ¸ö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
¡¡
=======================================================================
¡ô ·ÀÖ¹Ò»¸öûÓд°ÌåµÄWINDOWS³ÌÐòµÄÖØ¸´ÔËÐÐ
=======================================================================
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HINSTANCE hMutex=CreateMutex(NULL,FALSE,"RunOnlyOneInstance");
//ÃüÃûMutexÊÇÈ«¾Ö¶ÔÏó
if(hMutex==NULL||ERROR_ALREADY_EXISTS==::GetLastError())
{
return false;
}
try{¡¡
=======================================================================
¡ô À¹½ØWindowsÏûÏ¢ ½ûÖ¹WindowsÆÁÄ»±£»¤
=======================================================================
WindowsÔÚÆô¶¯ÆÁÄ»±£»¤³ÌÐòǰ»áÏòµ±Ç°¼¤»îµÄÓ¦ÓóÌÐò·¢ËÍWM_SYSCOMMANDÏûÏ¢£¬ÆäÖÐwP
aram²ÎÊýÖ¸¶¨Á˼´½«Ö´ÐеÄϵͳÃüÁîÀàÐÍ£¬ÔÚC++ BuilderÖпÉÒÔÀûÓÃTApplicationÀàµÄO
nMessageʼþ¾ä±úÀ´´¦ÀíÕâ¸öÏûÏ¢¡£Ó¦ÓóÌÐòÔÚ½ÓÊÕµ½ÈκÎWindowsÏûÏ¢ºó¶¼»á´¥·¢TAppl
icationÀàµÄOnMessageʼþ£¬Í¨¹ý¶¨ÒåÕâ¸öʼþµÄ´¦Àí³ÌÐò£¬¿ÉÒÔ²¶»ñ·¢Ë͸øÓ¦ÓóÌÐòµÄ
ËùÓÐWindowsÏûÏ¢¡£×¢£º²»°üÀ¨ÔÚ³ÌÐòÖÐÓÃSendMessageº¯Êý·¢Ë͵ÄÏûÏ¢
OnMessageʼþµÄ¶¨Ò壺
typedef void __fastcall (__closure *TMessageEvent)(tagMSG &Msg, bool &Handled)
;
__property TMessageEvent OnMessage = {read=FOnMessage, write
=FOnMessage};
¡¤ÆäÖÐTMessageEventÀàÐÍÊÇOnMessageʼþµÄÀàÐÍ£¬Ëü¶¨ÒåÁË´¦ÀíÏûÏ¢µÄ·½·¨
¡¤Msg²ÎÊý¸ø³öÁËWindowsÏûÏ¢µÄÏà¹ØÐÅÏ¢£¬Æä½á¹¹ÈçÏ£º
typedef struct tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;}
¡¤Handled²ÎÊý¾ö¶¨ÁËÈçºÎ¶ÔÏûÏ¢½øÐÐÏÂÒ»²½´¦Àí£¬Èç¹ûÔÚ½ÓÊÕµ½Ò»¸öÏûÏ¢ºó½«Handled²Î
ÊýÉèΪtrue£¬ÔòÕâ¸öÏûÏ¢½«²»»áµÃµ½½øÒ»²½µÄ´¦Àí£¬Ä¬ÈÏֵΪfalse
Àý£º½ûÖ¹WindowsÆÁÄ»±£»¤
private:
void _fastcall CaptureMessage(tagMSG &Msg,bool &Handled);
void __fastcall TForm1::CaptureMessage(tagMSG &Msg,bool &Handled)
{
if(Msg.message= =WM_SYSCOMMAND && Msg.wParam==SC_SCREENSAVE)
Handled=true; //×èÖ¹ÆÁÄ»±£»¤µÄÆô¶¯
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage=CaptureMessage;
}
=======================================================================
¡ô Òþ²Ø/ÏÔʾ×ÀÃæ
=======================================================================
HRGN hDesktop=FindWindow("ProgMan",NULL);
ShowWindow(hDesktop,SW_HIDE);
ShowWindow(hDesktop,SW_SHOW);
=======================================================================
¡ô Òþ²Ø/ÏÔʾ״̬À¸
=======================================================================
HRGN hTask=FindWindow("Shell_TrayWnd",NULL);
ShowWindow(hTask,SW_HIDE);
ShowWindow(hTask,SW_SHOW);
=======================================================================
¡ô Ëø¶¨/ÊÍ·ÅÊó±êË«»÷
=======================================================================
SetDoubleClickTime(2); //Ëø¶¨
SetDoubleClickTime(0); //ÊÍ·Å
=======================================================================
¡ô ÆÁ±Î/ÊÍ·Å Ctrl-Alt-Del Alt+Tab
=======================================================================
int temp=0;
SystemParametersInfo(SPI_SETFASTTASKSWITCH,1,&temp,0);
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,&temp,0);
int temp=0;
SystemParametersInfo(SPI_SETFASTTASKSWITCH,0,&temp,0);
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,&temp,0);
=======================================================================
¡ô ÐÞ¸ÄMsdos.sysÎļþ·ÀÖ¹¿ª»úʱ½øÈë×Ô¶¨ÒåÆô¶¯
=======================================================================
ÔÚ[Options]С½ÚÏÂÃæ£º
BootMulti=0 //ϵͳ²»ÄܽøÐжàÖØÒýµ¼
BootGUI=1 //Æô¶¯Ê±Ö±½Ó½øÈëWin98ͼÐÎÓû§½çÃæ
BootDelay=0 //Æô¶¯Ê±"Starting Windows 98..."ÐÅϢͣÁôʱ¼äΪ0·Ö
BootKeys=0 //Æô¶¯ÖÐʹF4,F5,F6,F8ʧЧ
=======================================================================
¡ô ÏÔʾ/Òþ²ØÈÎÎñÀ¸Í¼±ê
=======================================================================
// Òþ²ØÈÎÎñÀ¸Í¼±ê£º
SetWindowLong(Application->Handle,GWL_EXSTYLE, WS_EX_TOOLWINDOW);
// ÏÔʾÈÎÎñÀ¸Í¼±ê£º
SetWindowLong(Application->Handle,GWL_EXSTYLE, WS_EX_APPWINDOW);
=======================================================================
¡ô ³ÌÐòÒþ²ØÔËÐÐ
=======================================================================
ÐÞ¸ÄWinMainº¯Êý£º
¡¡
Application->ShowMainForm=false;
ShowWindow(Application->Handle, SW_HIDE);
Application->Run();
=======================================================================
¡ô ¼¯ºÏµÄ´¦Àí
=======================================================================
TShiftStateÀàÐÍ£º
enum Classes_1{ssShift,ssAlt,ssCtrl,ssRight,ssMiddle,ssDouble};
typedef Set<Classes_1,ssShift,ssDouble>TShiftSTate;
TShiftSTateÊÇÒ»¸ö¼¯ºÏ(Set)£¬Ò²¾ÍÊÇ˵£¬TShiftStateÊÇSysdefs.hÖÐSetÄ£°åÀàµÄÒ»¸öʵ
Àý¡£
Èç¹ûÏëÒªÖªµÀij¸öÔªËØÊDz»ÊǼ¯ºÏÖеÄÒ»¸ö³ÉÔ±£¬¿ÉÒÔʹÓÃContains·½·¨£º
ShiftKey->Checked=Shift.Contains(ssShift);
³ýÁËContains·½·¨Í⣬»¹¿ÉÒÔÔÚSetÀàÖÐʹÓÃÏÂÃæÈý¸öÔËËã·û£º
+ ²¢¼¯
- ²î¼¯
* ½»¼¯
ÉÏÃæÕâÈý¸öÔËËã·û¶¼·µ»ØÒ»¸ö¼¯ºÏ£¬¶øContains·µ»ØÒ»¸ö²¼¶ûÖµ¡£
=======================================================================
¡ô ×¢²áActiveX¿Ø¼þ
=======================================================================
¡¡Èç¹ûÄãÒª°ÑÄãµÄ³ÌÐò¸ø±ðÈËʹÓã¬ÎªÁË·ÀÖ¹ËûûÓа²×°»òÊÇ×¢²áswflash.ocxÎļþ¶øµ¼ÖÂ
³ÌÐòÎÞ·¨ÔËÐУ¬Äã±ØÐë°ÑOCXÎļþÒ²Ò»Æð¸½´øÉÏ£¬²¢ÔÚ³ÌÐòÖÐΪËüÔÚϵͳÖÐ×¢²á£¬×¢²á·½·¨
ÓÐÁ½ÖÖ£º
¡¾·½·¨Ò»¡¿µ÷ÓÃÍⲿ³ÌÐòRegsvr32.exe
×¢²á: ShellExecute(Handle,NULL,"regsvr32.exe",
"swflash.ocx",NULL,SW_SHOWNORMAL);
·´×¢²á£ºShellExecute(Handle,NULL,"regsvr32.exe",
"/u swflash.ocx",NULL,SW_SHOWNORMAL);
¡¾·½·¨¶þ¡¿µ÷Óÿؼþ±¾ÉíËù°üº¬µÄ×¢²áºÍ·´×¢²áº¯Êý
ÿһ¸öOCX¿Ø¼þÖж¼ÌṩÁËÁ½¸öÊä³öº¯Êý
"DllRegisterServer"ºÍ"DllUnRegisterServer"£¬¿ÉÒÔ×¢²áºÍ·´×¢²á¿Ø¼þ±¾Éí
ÎÒÃÇ¿ÉÒÔÓÃLoadLibrary()ºÍGetProcAddress()À´µ÷ÓÃËüÃÇ
ÕâºÍ¶¯Ì¬µ÷ÓÃDLL¿âµÄ·½·¨ÊÇÒ»Ñù
|