第9章__Win32編程_第1頁(yè)
第9章__Win32編程_第2頁(yè)
第9章__Win32編程_第3頁(yè)
第9章__Win32編程_第4頁(yè)
第9章__Win32編程_第5頁(yè)
已閱讀5頁(yè),還剩147頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第9 9章章 Win32Win32編程編程 第第9章章 Win32編程編程 9.1 調(diào)用調(diào)用Windows API 9.2 處理處理 Windows消息消息 9.3 使用剪貼板使用剪貼板 9.4 使用注冊(cè)表使用注冊(cè)表 9.5 使用動(dòng)態(tài)鏈接庫(kù)使用動(dòng)態(tài)鏈接庫(kù) 習(xí)題習(xí)題 第第9 9章章 Win32Win32編程編程 9.1 調(diào)用調(diào)用Windows API API是Application Programming Interface的縮寫,意為應(yīng)用程序界面(接口)。Windows 作為一種操作系統(tǒng),除了提供便利的圖形操作界面直接給用戶外,它給程序員提供的編程界面就是Windows API。通過(guò)API,

2、程序員能在應(yīng)用程序中調(diào)用由Windows系統(tǒng)提供的各種底層服務(wù)。 第第9 9章章 Win32Win32編程編程 9.1.1 Windows API的有關(guān)概念 Windows API都是以DLL輸出函數(shù)的形式提供的,大部分核心的API服務(wù)都在Kernel32.dll、GUI32.dll和User32.dll三個(gè)文件內(nèi),它們位于WindowsSystem (WinntSystem32)目錄內(nèi)。還有許多重要的API函數(shù)在Windows (Winnt)或WindowsSystem (WinntSystem32) 目錄中的其它DLL文件內(nèi)(本章第5節(jié)將介紹DLL)。這些函數(shù)數(shù)量龐大,而且隨著Window

3、s版本的升級(jí)仍在不斷增加。對(duì)于普通程序員來(lái)說(shuō),不可能也沒(méi)必要知道每個(gè)API函數(shù)的用法,但應(yīng)了解一些API的知識(shí)并且能在需要時(shí)迅速查到自己感興趣的API函數(shù)的資料。第第9 9章章 Win32Win32編程編程 在BCB中,一般只要利用VCL組件的屬性和事件就能完成90%以上的編程任務(wù),而且比使用API方便得多,這是因?yàn)锽CB很好地將API進(jìn)行了“包裝”,但還是會(huì)遇到有必要使用API的機(jī)會(huì)。BCB對(duì)使用API提供了很好的支持,大部分API函數(shù)可以在BCB中直接使用(指不必加入帶_declspec (dllimport) 修飾符的說(shuō)明)。當(dāng)然,必要時(shí)應(yīng)在項(xiàng)目中包含相應(yīng)的頭文件。 我們其實(shí)已經(jīng)與API

4、打過(guò)交道了,比如在本書基礎(chǔ)篇的第3章范例3-2中利用API取得INS等特殊鍵的狀態(tài);在應(yīng)用篇第4章則曾利用API播放波形聲音文件,是否每次使用API都給您留下了深刻的印象呢?第第9 9章章 Win32Win32編程編程 9.1.2 常用的Windows API函數(shù)介紹 本小節(jié)將分類介紹一些常用的API函數(shù),除了對(duì)少數(shù)具有代表性的API函數(shù)介紹得較詳細(xì)并給出應(yīng)用示例外,大部分僅以表格形式給出概括性的描述。讀者若要知道它們的詳細(xì)用法,可以查閱BCB的Help。在應(yīng)用程序的某個(gè)單元文件內(nèi)輸入API函數(shù)的名稱,然后將文本插入點(diǎn)移到該函數(shù)名稱上并按F1鍵,即可看到有關(guān)的說(shuō)明。更完整的參考書應(yīng)是Micro

5、soft的相關(guān)文獻(xiàn)。 1窗口控制類 與窗口控制有關(guān)的API函數(shù)很多,表9-1列出其中最常用的一部分。第第9 9章章 Win32Win32編程編程 表9-1 常用窗口控制API函數(shù) API函數(shù)名稱功 能 描 述GetActiveWindow獲得活動(dòng)窗口的句柄GetFocus獲得擁有輸入焦點(diǎn)窗口的句柄GetParent獲得指定窗口的父窗口IsChild判斷一個(gè)窗口是否為另一窗口的子窗口IsIconic判斷一個(gè)窗口是否處于最小化狀態(tài)SetWindowPos改變窗口的位置MoveWindow改變窗口的位置和大小第第9 9章章 Win32Win32編程編程 BringWindowToTop將指定的窗口帶

6、到頂部FindWindow尋找符合某些條件的窗口FlashWindow使指定的窗口閃爍顯示GetWindowText取窗口的標(biāo)題或控件的內(nèi)容SetWindowText設(shè)置窗口標(biāo)題或控件的內(nèi)容EnableWindow允許或禁止對(duì)指定窗口的輸入ShowWindow控制窗口的可見(jiàn)性CloseWindow關(guān)閉窗口,但不會(huì)從內(nèi)存中清除DestroyWindow清除指定窗口及其它的所有子窗口第第9 9章章 Win32Win32編程編程 對(duì)于BCB中的窗體,我們一般可以用調(diào)用窗體對(duì)象的方法來(lái)控制,而對(duì)于某些不是由BCB編寫的應(yīng)用程序所產(chǎn)生的窗體,我們也可以在BCB應(yīng)用程序中調(diào)用窗口控制API函數(shù)對(duì)它們進(jìn)行控

7、制。 窗體控制API函數(shù)一般都會(huì)用到一個(gè)稱為窗口句柄的參數(shù),在Windows中窗口句柄的類型為HWND,它可以被理解為是一種指針。對(duì)于BCB窗體,可以用handle屬性取得窗口句柄。對(duì)于非BCB窗體,則可以用GetActiveWindow、FindWindow等API函數(shù)取得其句柄。第第9 9章章 Win32Win32編程編程 下面一個(gè)例子是在當(dāng)前Windows環(huán)境下查找一個(gè)標(biāo)題為“Hello”的窗口,如果查到該窗口,就將其標(biāo)題改為“How Are You”。 HWND hWnd ; if (hWnd = FindWindow (0, Hello) SetWindowText (hWnd, H

8、ow Are You); else ShowMessage (Window Not Found );第第9 9章章 Win32Win32編程編程 注意:SetWindowText 的第一個(gè)參數(shù)是被設(shè)置標(biāo)題的窗口句柄。FindWindow的第一個(gè)參數(shù)指定要查找的窗口類型,該參數(shù)等于“0”表示對(duì)類型無(wú)任何限制。第二個(gè)參數(shù)指定要查找的窗口的標(biāo)題。第第9 9章章 Win32Win32編程編程 2文件操作類 BCB對(duì)基本文件處理的支持較弱,但結(jié)合使用有關(guān)的API功能,就能充分滿足各種需求。常用文件操作API函數(shù)如表9-2所示。 第第9 9章章 Win32Win32編程編程 表9-2 常用文件操作API函

9、數(shù)API函數(shù)名稱功 能 描 述CreateFile創(chuàng)建文件、管道等OpenFile打開(kāi)文件CloseHandle關(guān)閉文件GetFileAttributes獲取指定文件的屬性GetFileSize獲取指定文件的長(zhǎng)度GetFileTime獲取指定文件的時(shí)間信息CopyFile復(fù)制文件第第9 9章章 Win32Win32編程編程 DeleteFile刪除指定的文件FindFirstFile查找符合條件的文件FindNextFile查找下一個(gè)文件(與FindFirstFile結(jié)合使用)ReadFile讀文件中數(shù)據(jù)至緩沖區(qū)WriteFile將緩沖區(qū)中數(shù)據(jù)寫入文件CreateDirectory創(chuàng)建一個(gè)目錄

10、RemoveDirectory刪除指定目錄SetCurrentDirectory設(shè)置當(dāng)前目錄第第9 9章章 Win32Win32編程編程 GetDriveType判斷驅(qū)動(dòng)器的類型(如硬盤、軟盤、網(wǎng)絡(luò)、CD-ROM等)GetDiskFreeSpaceEx獲取磁盤的剩余容量RegCreateKeyEx創(chuàng)建一個(gè)注冊(cè)表子項(xiàng)RegOpenKeyEx打開(kāi)注冊(cè)表上一個(gè)項(xiàng)RegDeleteKey刪除注冊(cè)表上一個(gè)項(xiàng)RegQueryValueEx獲取注冊(cè)表上一個(gè)項(xiàng)的值RegSetValueEx設(shè)置注冊(cè)表上指定項(xiàng)的值RegEnumKeyEx枚舉注冊(cè)表上指定項(xiàng)的子項(xiàng)RegEnumValue枚舉注冊(cè)表上指定項(xiàng)的值第第9

11、 9章章 Win32Win32編程編程 這些函數(shù)使用相對(duì)較復(fù)雜,并涉及到Windows中定義的一些專用的結(jié)構(gòu)體類型。下面是一個(gè)創(chuàng)建目錄的例子。 SECURITY_ATTRIBUTES *SA; SA=new (SECURITY_ATTRIBUTES ); if (!CreateDirectory (C:NewSub2, SA) ShowMessage (Not Successful !); delete (SA); API函數(shù)CreateDirectory需要一個(gè)SECURITY_ATTRIBUTES 類型的參數(shù)傳送有關(guān)的安全屬性,本例中用new動(dòng)態(tài)創(chuàng)建了一個(gè)這種結(jié)構(gòu),使用的是缺省設(shè)置。第第9

12、 9章章 Win32Win32編程編程 3圖形與圖像處理類 Windows是圖形操作系統(tǒng),與圖形、圖像有關(guān)的API功能調(diào)用十分豐富,表9-3列出了其中的一部分。第第9 9章章 Win32Win32編程編程 表9-3 常用圖形與圖像API函數(shù)API函數(shù)名稱功 能 描 述DrawText將文本描繪到指定的矩形 (可選擇字體、顏色等)GetDC取得某輸出設(shè)備句柄GetTextColor取指定設(shè)備中當(dāng)前文本的顏色SetTextColor設(shè)置指定設(shè)備中當(dāng)前文本的顏色TextOut在指定設(shè)備的指定位置輸出文本ExtTextOut擴(kuò)展的TextOut,能對(duì)文本輸出進(jìn)行各種控制LineTo用畫筆從當(dāng)前位置至指

13、定位置畫直線段第第9 9章章 Win32Win32編程編程 MoveToEx指定畫筆的當(dāng)前位置PolyBezier畫貝塞爾(Bezier)曲線PolyLine畫由一系列線段組成的折線(可封閉成多邊形)Polygon畫多邊形,內(nèi)部用畫刷填充Rectangle畫矩形,內(nèi)部用畫刷填充RoundRect畫圓角矩形,內(nèi)部用畫刷填充Ellipse畫橢圓,內(nèi)部用畫刷填充Arc畫一段圓弧Pie畫一個(gè)扇形,內(nèi)部用畫刷填充GetPixel取像素的顏色第第9 9章章 Win32Win32編程編程 SetPixel設(shè)置像素顏色CreatePen用指定的風(fēng)格、寬度和顏色創(chuàng)建一畫筆CreateSolidBrush用純色創(chuàng)

14、建一個(gè)畫刷CreateHatchBrush創(chuàng)建帶有圖案的畫刷ExtFloodFill用當(dāng)前畫刷填充一個(gè)區(qū)域FillRect用畫刷填充一個(gè)矩形CreateBitmap創(chuàng)建一幅位圖第第9 9章章 Win32Win32編程編程 LoadBitmap載入一幅位圖BitBlt在位圖間傳送一矩形區(qū)域內(nèi)圖像StretchBlt伸縮一個(gè)位圖CreateCursor創(chuàng)建一個(gè)鼠標(biāo)指針LoadCursor載入一個(gè)鼠標(biāo)指針CreateIcon創(chuàng)建一個(gè)圖標(biāo)LoadIcon載入一個(gè)圖標(biāo)DrawIcon在指定位置畫一個(gè)圖標(biāo) 第第9 9章章 Win32Win32編程編程 這些API功能大部分可以在BCB中利用畫布(Canva

15、s)等對(duì)象的方法來(lái)完成,但也有一些是BCB對(duì)象所沒(méi)有的,如PolyBezier、Arc、ExtFloodFill等。此外,使用API的效率可能會(huì)高一點(diǎn)。而對(duì)于非BCB窗體,API是惟一的選擇。 BCB在抽象的Canvas上進(jìn)行繪圖,但使用API時(shí),必須指定輸出設(shè)備。Windows中用HDC表示輸出設(shè)備的句柄。若想在窗口上繪圖,則首先要用GetDC取得窗口的設(shè)備句柄,然后將此句柄傳給各個(gè)API繪圖函數(shù)。下面是一個(gè)簡(jiǎn)單例子。第第9 9章章 Win32Win32編程編程 HDC hdc;hdc=GetDC (Form1-Handle);Rectangle (hdc,10,10,120,100);Te

16、xtOut (hdc, 20 , 30, ABCDE, 5);第第9 9章章 Win32Win32編程編程 4系統(tǒng)管理與服務(wù)類 這些函數(shù)提供Windows系統(tǒng)管理及有關(guān)服務(wù)與信息,它們非常有用。常用Windows系統(tǒng)管理與服務(wù)API函數(shù)如表9-4所示。第第9 9章章 Win32Win32編程編程 表9-4 常用Windows系統(tǒng)管理與服務(wù)API函數(shù)API函數(shù)名稱功 能 描 述GetSystemInfo獲取與底層硬件平臺(tái)有關(guān)的信息GetSystemPowerStatus獲取系統(tǒng)電源狀態(tài) (對(duì)便攜機(jī)特別重要)GetLocalTime獲取本地日期和時(shí)間SetLocalTime設(shè)置日期和時(shí)間GetUs

17、erName獲取當(dāng)前用戶的名字GetComputerName獲取計(jì)算機(jī)名稱第第9 9章章 Win32Win32編程編程 WinExec運(yùn)行外部應(yīng)用程序ExitWindowsEx退出Windows并關(guān)閉或重新啟動(dòng)系統(tǒng)等SetWindowRgn創(chuàng)建形狀各異的窗口OpenClipboard打開(kāi)剪貼板EmptyClipboard清除剪貼板上的數(shù)據(jù)CloseClipboard關(guān)閉剪貼板GetClipboardData獲取剪貼板數(shù)據(jù)SetClipboardData將數(shù)據(jù)放到剪貼板上第第9 9章章 Win32Win32編程編程 首先介紹ExitWindowsEx的使用方法。該函數(shù)很強(qiáng)大,可以退出Window

18、s并且關(guān)機(jī)或重新啟動(dòng)等。它有兩個(gè)參數(shù),第一個(gè)參數(shù)指定退出方式,可以使用以下一個(gè)或多個(gè)(用“|”運(yùn)算符合并)預(yù)定義值:EWX_REBOOT、EWX_FORCE、EWX_LOGOFF和EWX_SHUTDOWN等,它們分別表示重新啟動(dòng)、強(qiáng)迫中止沒(méi)有響應(yīng)的進(jìn)程、中止進(jìn)程并注銷用戶和關(guān)閉系統(tǒng)等。第二個(gè)參數(shù)一般可設(shè)為0。第第9 9章章 Win32Win32編程編程 例如,執(zhí)行“ExitWindowsEx (EWX_REBOOT, 0);”可退出Windows并重新啟動(dòng)。實(shí)驗(yàn)時(shí),應(yīng)在Windows下運(yùn)行.exe可執(zhí)行文件。 接下來(lái)再介紹一個(gè)SetLocalTime,它使用一個(gè)SYSTEMTIME* 類型的參

19、數(shù),下面是一個(gè)例子。第第9 9章章 Win32Win32編程編程 SYSTEMTIME *SLT;SLT = new SYSTEMTIME;SLT-wYear = 2003;SLT-wMonth = 10;SLT-wDay = 1;SLT-wHour = 0;SLT-wMinute = 0;SLT-wSecond = 10;SetLocalTime (SLT);delete (SLT);第第9 9章章 Win32Win32編程編程 執(zhí)行這一段代碼后,系統(tǒng)的日期、時(shí)間改變?yōu)?003/10/1,0: 0: 10。 表格中有幾個(gè)與剪貼板(Clipboard)有關(guān)的API函數(shù)也是很有用的,在本章第3節(jié)

20、會(huì)介紹它們的用法。第第9 9章章 Win32Win32編程編程 5其它API函數(shù) 除了以上幾個(gè)方面的API函數(shù)外,在下一節(jié)我們將較詳細(xì)地介紹與Windows 消息有關(guān)的幾個(gè)API。其它方面的API還有:多媒體播放技術(shù)API、DDE、剪貼板、注冊(cè)表等操作的API、網(wǎng)絡(luò)技術(shù)方面如Socket API、支持訪問(wèn)OLE與COM對(duì)象的API、對(duì)特定的設(shè)備如打印機(jī)或者CD-ROM 提供支持的API等,有興趣的讀者可參考有關(guān)資料。我們的建議是盡可能通過(guò)BCB提供的組件,使用屬性、事件和方法解決問(wèn)題,而將使用API作為最后的選擇。第第9 9章章 Win32Win32編程編程 9.2 處理處理 Windows消

21、息消息 9.2.1 Windows消息機(jī)制 在Windows中,單擊鼠標(biāo)、改變窗口尺寸、按下鍵盤上的一個(gè)鍵都會(huì)使Windows發(fā)送一個(gè)消息給應(yīng)用程序。消息本身是作為一個(gè)記錄傳遞給應(yīng)用程序的,這個(gè)記錄中包含了消息的類型以及其它信息。例如,對(duì)于單擊鼠標(biāo)所產(chǎn)生的消息來(lái)說(shuō),這個(gè)記錄中包含了單擊鼠標(biāo)時(shí)的坐標(biāo)。第第9 9章章 Win32Win32編程編程 一個(gè)消息是由一個(gè)消息名稱(UINT)和兩個(gè)參數(shù)(WPARAM,LPARAM)組成的。當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí)系統(tǒng)都會(huì)發(fā)送消息到某一個(gè)窗口。例如,當(dāng)某菜單項(xiàng)被選中之后會(huì)有WM_COMMAND消息發(fā)送,該消息的WPARAM的高字中(HIWOR

22、D(wParam)存放的是命令的ID號(hào),就是菜單ID。此外,用戶也可以定義自己的消息,也可以利用自定義消息來(lái)發(fā)送通知和傳送數(shù)據(jù)。第第9 9章章 Win32Win32編程編程 常用的消息有WM_COMMAND、WM_CLOSE、WM_QUIT、WM_LBUTTONDOWN和WM_SETFOCUS等。 消息的概念離不開(kāi)窗口句柄,系統(tǒng)通過(guò)窗口句柄在整個(gè)系統(tǒng)中惟一標(biāo)識(shí)一個(gè)窗口,發(fā)送一個(gè)消息時(shí)必須指定一個(gè)窗口句柄表明該消息由哪個(gè)窗口接收。而每個(gè)窗口都會(huì)有自己的窗口過(guò)程,所以用戶的輸入就會(huì)被正確的處理。例如,當(dāng)前環(huán)境下有兩個(gè)窗口,當(dāng)你在窗口一上按下鼠標(biāo)時(shí),Windows就會(huì)將消息通過(guò)窗口一的句柄發(fā)送到窗口

23、一的窗口過(guò)程進(jìn)行處理,而不會(huì)被窗口二處理。第第9 9章章 Win32Win32編程編程 以下是三個(gè)與消息有關(guān)的常用API 函數(shù): BroadcastSystemMessage 它的作用是將消息廣播給所有的頂級(jí)窗口。 SendMessage 它的作用是發(fā)送一條消息給某窗口并等待,直到消息處理完畢后返回。 PostMessage 它的作用是投遞一條消息到某窗口,并立即返回。第第9 9章章 Win32Win32編程編程 【例9-1】 程序窗體中放入一個(gè)編輯框和一個(gè)按鈕,按鈕的OnClick事件執(zhí)行如下代碼:void_fastcall TForm1:Button1Click (TObject *Sen

24、der) HWND hWnd ; if (hWnd = FindWindow (0, Edit1-Text.c_str ( ) PostMessage (hWnd, WM_CLOSE, 0, 0); else ShowMessage (Window not found);第第9 9章章 Win32Win32編程編程 現(xiàn)在可以進(jìn)行實(shí)驗(yàn)了。首先啟動(dòng)某個(gè)Windows應(yīng)用程序(比如是Windows的“計(jì)算器”),然后運(yùn)行我們自己的程序,在程序的編輯框中輸入先前啟動(dòng)的那個(gè)程序的標(biāo)題(比如標(biāo)題為“計(jì)算器”),然后點(diǎn)擊程序中的按鈕。我們會(huì)發(fā)現(xiàn)先前啟動(dòng)的那個(gè)程序被關(guān)閉了。因?yàn)樵摮绦虻拇翱诮邮盏揭粭lWM_CL

25、OSE消息,就關(guān)門大吉了。第第9 9章章 Win32Win32編程編程 本例中用到了PostMessage函數(shù),該函數(shù)的原型是: BOOL PostMessage(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam); 其中,hWnd是接受消息的窗口的句柄,Msg是一個(gè)消息,wParam、lParam是該消息的附加信息(參數(shù))。 對(duì)接收消息的程序來(lái)說(shuō),一般并不知道該消息來(lái)自何方,往往以為這是Windows給它的指令。就像例子中的“計(jì)算器”程序那樣,莫名奇妙地被人家關(guān)閉了。第第9 9章章 Win32Win32編程編程 9.2.2 消息與BCB 事件

26、熟悉Windows編程的讀者可能知道,Windows的每一個(gè)窗口都有一個(gè)自己的消息處理函數(shù)(窗口過(guò)程),它能接收到Windows傳送給該窗口的每一個(gè)消息,然后按照自己的邏輯去處理這些消息。如果沒(méi)有BCB的組件和應(yīng)用程序框架(或其它類似框架),那么必須由程序員自己寫完整的窗口過(guò)程。第第9 9章章 Win32Win32編程編程 消息是操作系統(tǒng)級(jí)的概念,而事件則是消息經(jīng)過(guò)面向?qū)ο蠓庋b的產(chǎn)物。BCB是一個(gè)Windows快速開(kāi)發(fā)工具,它鼓勵(lì)程序員盡可能的使用經(jīng)過(guò)面向?qū)ο笏枷敕庋b過(guò)的各組件來(lái)進(jìn)行Windows編程,這樣無(wú)論是從可移植性、繼承性方面,還是從可讀性方面來(lái)說(shuō)都有利于軟件的開(kāi)發(fā)。在BCB編程環(huán)境下

27、,編程者一般只要處理相對(duì)比較容易理解的事件而避免直接與窗口過(guò)程打交道。第第9 9章章 Win32Win32編程編程 但是Borland公司不可能將所有的消息都封裝成事件供程序員使用,并且有些地方必須程序員自己動(dòng)手去攔截消息,才能開(kāi)發(fā)出功能強(qiáng)大且有新意的程序。因此,在BCB 程序中使用消息是對(duì)事件編程的一個(gè)補(bǔ)充。 在BCB程序中處理消息其實(shí)很容易,因?yàn)門Form類具有虛擬方法WndProc可供應(yīng)用程序重載。該方法有一個(gè)參數(shù)可以接收Windows消息,它的的原型為第第9 9章章 Win32Win32編程編程 WndProc (Messages:TMessage &Message); 我們只

28、要在程序中重載該方法,就能攔截我們感興趣的特定消息進(jìn)行處理,并且仍然可以使用事件處理其它消息。下面是一個(gè)例子。第第9 9章章 Win32Win32編程編程 【例9-2】 本例非常簡(jiǎn)單,我們?cè)赨nit1.h頭文件中關(guān)于TForm1聲明中插入方法WndProc的聲明表示需要重載該方法,然后在Unit1.cpp中給出該方法完整的定義。下面列出這兩個(gè)文件: 第第9 9章章 Win32Win32編程編程 /以下是在Unit1.h中需插入的語(yǔ)句class TForm1 : public TForm_published:/ IDE-managed Componentsprivate:public:/ Use

29、r declarations_fastcall TForm1(TComponent* Owner); void_fastcall TForm1:WndProc(TMessage &Msg);第第9 9章章 Win32Win32編程編程 /-/以下在Unit1.cpp中編寫消息處理代碼void_fastcall TForm1:WndProc (TMessage &Msg) switch (Msg.Msg) case WM_KILLFOCUS: /該消息表示窗口失去焦點(diǎn) Caption = 窗口為脫焦?fàn)顟B(tài)!; Msg.Result = true; return;第第9 9章章 Wi

30、n32Win32編程編程 case WM_SETFOCUS: /該消息表示窗口獲得焦點(diǎn) Caption = 窗口為聚焦?fàn)顟B(tài)!; Msg.Result = true; return; default: /對(duì)其它的消息由TForm1父類的WndProc過(guò)程進(jìn)行處理 TForm:WndProc (Msg); 運(yùn)行該程序,當(dāng)程序窗口獲得焦點(diǎn)(Focus)或失去焦點(diǎn)時(shí),窗口標(biāo)題上會(huì)有相應(yīng)的顯示,如圖9-1和圖9-2所示。第第9 9章章 Win32Win32編程編程 圖9-1 窗口獲得焦點(diǎn) 第第9 9章章 Win32Win32編程編程 圖9-2 窗口失去焦點(diǎn) 第第9 9章章 Win32Win32編程編程

31、【評(píng)析】 (1) 本例中僅攔截并處理WM_SETFOCUS和WM_KILLFOCUS兩種消息,其余消息調(diào)用父類的WndProc按缺省方式處理,這是非常巧妙的做法。這樣既滿足了程序中特定的需求,又能繼續(xù)享用BCB提供的便利(如使用與窗口焦點(diǎn)無(wú)關(guān)的事件等)。 (2) 在WndProc中處理消息與直接編寫Windows窗口函數(shù)仍有一定區(qū)別,如方法參數(shù)被定義為TMessage 類的引用,仍然被對(duì)象技術(shù)薄薄地包裝了一下。這樣就比較好用,如可以用Msg.Result返回結(jié)果等。第第9 9章章 Win32Win32編程編程 9.2.3 鉤子程序 鉤子(Hook)是Microsoft Windows消息處理機(jī)

32、制中較底層的一部分,通過(guò)鉤子應(yīng)用程序可以安裝一個(gè)子程序來(lái)監(jiān)視系統(tǒng)中消息的往來(lái),還能在消息到達(dá)目的窗口過(guò)程之前處理某個(gè)類型的消息。第第9 9章章 Win32Win32編程編程 鉤子不僅能攔截送往某個(gè)窗口的消息,而且可以攔截所有的Windows消息。因此,鉤子具有全局性。Windows系統(tǒng)中含有多種不同類型的鉤子,每個(gè)類型都針對(duì)一種Windows消息的通路。例如,應(yīng)用程序能夠使用WH_MOUSE鉤子來(lái)監(jiān)視鼠標(biāo)的消息往來(lái)。由于消息通路上可能存在由多個(gè)程序設(shè)置的不同鉤子,因此Windows系統(tǒng)為每一條通路管理了一個(gè)獨(dú)立的鉤子鏈。第第9 9章章 Win32Win32編程編程 鉤子鏈?zhǔn)且粋€(gè)指向特殊的稱之為

33、鉤子過(guò)程的應(yīng)用程序定義的回調(diào)函數(shù)的指針列表。如果有與某種特定類型的鉤子相應(yīng)的消息,那么Windows系統(tǒng)會(huì)把這條消息一個(gè)接一個(gè)傳給相應(yīng)鉤子鏈中的鉤子過(guò)程。鉤子按照“后到者先干” 原理進(jìn)行工作,即最后安裝的鉤子最早攔截到消息。使用鉤子有可能減低系統(tǒng)的性能,因?yàn)樗鼈冊(cè)黾恿讼到y(tǒng)為每一條消息進(jìn)行處理的總量。開(kāi)發(fā)人員應(yīng)該只在需要的時(shí)候才使用鉤子,并在不用時(shí)盡快刪除掉鉤子。第第9 9章章 Win32Win32編程編程 在BCB中開(kāi)發(fā)鉤子程序主要用到 API函數(shù) SetWindowsHookEx,該函數(shù)的原型為 HHOOK SetWindowsHookEx ( int idHook, / 要安裝的鉤子類型

34、HOOKPROC lpfn, / 鉤子過(guò)程的地址 HINSTANCE hMod,/ 應(yīng)用實(shí)例的句柄 DWORD dwThreadId / 需要安裝該鉤子的線程的ID號(hào) ); 下面是一個(gè)鉤子程序的實(shí)例,程序攔截到鍵盤消息時(shí)的反應(yīng)如圖9-3所示。第第9 9章章 Win32Win32編程編程 圖9-3 鉤子程序攔截到鍵盤消息第第9 9章章 Win32Win32編程編程 【例9-3】 在Form中放入一個(gè)Label并設(shè)置其Caption為“請(qǐng)按(Shift+S)鍵測(cè)試”;在Unit1中定義一個(gè)回調(diào)函數(shù)CALLBACK KeyboardProc;再處理Form1 的 OnCreate和OnDestroy

35、事件。 下面列出需要寫入U(xiǎn)nit1.h和Uint1.cpp中的代碼: /在Unit1.h中插入 HHOOK hHook; LRESULT CALLBACK KeyboardProc (int, WPARAM, LPARAM);第第9 9章章 Win32Win32編程編程 /以下是Unit1.cpp中的代碼-LRESULT CALLBACK KeyboardProc (int nCode, WPARAM wParam, LPARAM lParam) if (nCode0) return CallNextHookEx (hHook, nCode, wParam, lParam); else if

36、(GetKeyState (VK_SHIFT) & 0 xF0000000) & wParam = S) ShowMessage (You Press Shift+s Keys!);第第9 9章章 Win32Win32編程編程 return CallNextHookEx (hHook, nCode, wParam, lParam); /將控制轉(zhuǎn)移到鉤子鏈的下一環(huán) /-void_fastcall TForm1:FormCreate (TObject *Sender) hHook = SetWindowsHookEx (WH_KEYBOARD, (HOOKPROC) Keyboar

37、dProc, (HINSTANCE) NULL, GetCurrentThreadId ( );第第9 9章章 Win32Win32編程編程 /-void_fastcall TForm1:FormDestroy (TObject *Sender) UnhookWindowsHookEx (hHook); /將鉤子釋放第第9 9章章 Win32Win32編程編程 【評(píng)析】 (1) API函數(shù)SetWindowsHookEx 用于設(shè)置鉤子:第一個(gè)參數(shù)WH_KEYBOARD指定鉤子的類型為處理鍵盤消息;第二個(gè)參數(shù)指定KeyboardProc函數(shù)為處理消息的過(guò)程;第三個(gè)參數(shù)可控制消息的范圍,取值為NU

38、LL時(shí)只能截取送往單個(gè)線程的消息(在本章稍后我們會(huì)修改本例,使能攔截送往任何線程的消息);最后一個(gè)參數(shù)指定需攔截消息的線程為鉤子程序本身的主線程(使用GetCurrentThreadId 取得線程ID)。第第9 9章章 Win32Win32編程編程 (2) 本例中KeyboardProc作為特定消息處理函數(shù)按規(guī)定一定要聲明為回調(diào)函數(shù)(大致上講,回調(diào)函數(shù)是由用戶定義并且由操作系統(tǒng)在滿足一定條件時(shí)進(jìn)行調(diào)用的函數(shù)),該函數(shù)參數(shù)的個(gè)數(shù)和類型是預(yù)先由Windows規(guī)定好的(每種類型的鉤子都有確定的函數(shù)原型,詳細(xì)可查Help)。第第9 9章章 Win32Win32編程編程 (3) nCodeCopyToC

39、lipboard( );”以及“PasteFromClipboard ( );”。CopyToClipboard和CutToClipboard方法的使用與控件中被選中的內(nèi)容有關(guān),可用于確定被選內(nèi)容的屬性有SelLength、SelStart、SelText等。第第9 9章章 Win32Win32編程編程 一般來(lái)說(shuō),使用控件的剪貼板方法是非常方便的。為了使程序在對(duì)剪貼板的支持方面更完善、更專業(yè),我們還要注意以下幾點(diǎn): (1) 僅當(dāng)輸入焦點(diǎn)位于一個(gè)具有剪貼板方法的控件中,并且該控件內(nèi)有被選中的內(nèi)容時(shí)菜單項(xiàng)“Cut”、“Copy”為可用(Enabled為true)。 (2) 僅當(dāng)輸入焦點(diǎn)位于一個(gè)具有

40、剪貼板方法的控件中,并且此時(shí)在剪貼板上已存有可供粘貼的內(nèi)容時(shí),菜單項(xiàng)“Paste”為可用。 (3) 如果剪貼板上的內(nèi)容與當(dāng)前控件使用的數(shù)據(jù)格式不一致,則在可能的情況下應(yīng)將其轉(zhuǎn)換為可用格式后進(jìn)行粘貼。第第9 9章章 Win32Win32編程編程 9.3.3 使用TClipboard類 BCB定義的TClipboard類,包裝了與剪貼板操作相關(guān)的API,使用時(shí)非常方便。為了能使用TClipboard類,請(qǐng)?jiān)趹?yīng)用程序項(xiàng)目中包括Clipbrd.hpp。 下面講講TClipboard類的主要屬性和方法。 1AsText屬性 AsText屬性為AnsiString數(shù)據(jù)類型,對(duì)其進(jìn)行讀操作時(shí)可從剪貼板中取出

41、文本格式的內(nèi)容,寫操作時(shí)可將文本放到剪貼板上。第第9 9章章 Win32Win32編程編程 2FormatCount屬性 FormatCount屬性返回當(dāng)前可以使用的剪貼板格式的數(shù)目,該屬性為只讀。 3Formats屬性 Formats屬性為一個(gè)數(shù)組,保存了當(dāng)前可以使用的所有剪貼板格式。這些格式既可以是標(biāo)準(zhǔn)格式,也可以是應(yīng)用程序自定義的格式,總數(shù)應(yīng)等于FormatCount屬性的值。 4Assign方法 Assign方法將指定的圖形或圖像復(fù)制到剪貼板上。第第9 9章章 Win32Win32編程編程 5Clear方法 Clear方法將剪貼板上的內(nèi)容全部清除。 6Close方法 Close方法關(guān)閉

42、剪貼板。 7GetAsHandle方法 GetAsHandle方法取得剪貼板上指定格式數(shù)據(jù)的句柄,該句柄可用于API調(diào)用。第第9 9章章 Win32Win32編程編程 8GetComponent方法 GetComponent方法從剪貼板上粘貼一個(gè)控件,剪貼板上的控件一般是事先使用SetComponent方法放入的。 9GetTextBuf方法 GetTextBuf方法從剪貼板上復(fù)制文本到一個(gè)緩沖區(qū)。 10HasFormat方法 HasFormat方法檢測(cè)當(dāng)前剪貼板上是否有指定格式的內(nèi)容。第第9 9章章 Win32Win32編程編程 11Open方法 Open方法打開(kāi)剪貼板,隨后即可向剪貼板寫入

43、一系列的內(nèi)容,處于打開(kāi)狀態(tài)的剪貼板上的內(nèi)容不會(huì)被其它程序的內(nèi)容覆蓋,打開(kāi)的剪貼板應(yīng)使用Close方法關(guān)閉。第第9 9章章 Win32Win32編程編程 12SetAsHandle方法 SetAsHandle方法設(shè)置一個(gè)數(shù)據(jù)的句柄到剪貼板,以此將數(shù)據(jù)置入剪貼板。 13SetComponent方法 SetComponent方法將一個(gè)控件復(fù)制到剪貼板。 14SetTextBuf方法 SetTextBuf方法將緩沖區(qū)內(nèi)的文本復(fù)制到剪貼板。第第9 9章章 Win32Win32編程編程 【例9-4】 建立一個(gè)應(yīng)用程序項(xiàng)目,在Form1中放入三個(gè)按鈕,按鈕的標(biāo)簽分別為“CF_TEXT”、“CF_BITMAP

44、”和“Open_Clipboard”。按下“CF_TEXT”按鈕時(shí),程序?qū)⒓糍N板上文本格式的數(shù)據(jù)顯示到窗體的標(biāo)題欄;按下“CF_BITMAP”按鈕時(shí),程序?qū)⒓糍N板上位圖格式的圖像數(shù)據(jù)畫到窗體的畫布(Canvas)上顯示;按下“Open_Clipboard”按鈕時(shí),打開(kāi)剪貼板,將一段文本數(shù)據(jù)和一幅圖片中的位圖數(shù)據(jù)同時(shí)放入剪貼板。第第9 9章章 Win32Win32編程編程 /在Uint1.h中加入 #include /以下為Unit1.cpp中三個(gè)按鈕的OnClick事件代碼 void_fastcall TForm1:Button1Click (TObject *Sender) if (Clip

45、board ( )-HasFormat (CF_TEXT) char* str1= (char *) malloc (100); /創(chuàng)建字符串str1并分配內(nèi)存第第9 9章章 Win32Win32編程編程 Clipboard ( )-GetTextBuf (str1,100); /將剪貼板上文本格式數(shù)據(jù)存入str1 Form1-Caption = str1; free (str1); /釋放str1 /- void_fastcall TForm1:Button2Click (TObject *Sender) if (Clipboard ( )-HasFormat (CF_BITMAP) 第第9

46、 9章章 Win32Win32編程編程 TPicture *pic1 = new TPicture; pic1-Assign (Clipboard ( ); /將剪貼板上位圖格式數(shù)據(jù)存入pic1 Canvas-Draw (0, 0, pic1-Graphic); /將pic1畫到Canvas delete pic1; /-void_fastcall TForm1:Button3Click (TObject *Sender)第第9 9章章 Win32Win32編程編程 Clipboard ( )-Open ( ); /打開(kāi)剪貼板 Clipboard ( )-SetTextBuf (Hello);

47、 /將文本放入剪貼板 TPicture *pic1 = new TPicture; pic1-LoadFromFile (building.bmp); /將圖像文件讀入pic1 Clipboard ( )-Assign (pic1); /將pic1內(nèi)的圖像放入剪貼板 Clipboard ( )-Close ( ); /關(guān)閉剪貼板第第9 9章章 Win32Win32編程編程 圖9-5 范例9-4運(yùn)行時(shí)的畫面第第9 9章章 Win32Win32編程編程 【評(píng)析】 (1) GetTextBuf 方法的BCB聲明為語(yǔ)句“int_fastcall GetTextBuf (char * Buffer, i

48、nt BufSize);”其中,第一個(gè)參數(shù)為字符指針類型的緩沖區(qū),它用于存放剪貼板上的文本。第二個(gè)整型參數(shù)可限制存入到緩沖區(qū)的字符個(gè)數(shù),一般應(yīng)等于緩沖區(qū)的長(zhǎng)度。范例中用 (char *) malloc (100) 為緩沖區(qū)指針str1動(dòng)態(tài)分配內(nèi)存,并在結(jié)束使用后用free釋放。第第9 9章章 Win32Win32編程編程 (2) 使用Open方法,使得在執(zhí)行Close方法之前存入剪貼板的數(shù)據(jù)不會(huì)被覆蓋。如果在運(yùn)行范例9-4時(shí)按一下“Open Clipboard”按鈕,再通過(guò)“剪貼板查看程序”進(jìn)行觀察,如圖9-6所示,我們看到當(dāng)前剪貼板內(nèi)有文本、位圖、調(diào)色板等格式的數(shù)據(jù)。如果我們?cè)诔绦蛑胁徽{(diào)用O

49、pen方法,則剪貼板上文本格式的數(shù)據(jù)會(huì)被圖像格式的數(shù)據(jù)覆蓋掉。 (3) TClipboard 是非常特殊的類,它只有一個(gè)對(duì)象實(shí)例。用戶不能在程序中生成該類的實(shí)例,而只能調(diào)用由Clipboard ( ) 函數(shù)返回的那個(gè)惟一實(shí)例。第第9 9章章 Win32Win32編程編程 圖9-6 查看程序顯示出剪貼板上存有多種格式的數(shù)據(jù) 第第9 9章章 Win32Win32編程編程 9.4 使使 用用 注注 冊(cè)冊(cè) 表表 9.4.1 注冊(cè)表在Windows下的作用 早期的Win3.x主要采用.ini文件保存系統(tǒng)及應(yīng)用程序的有關(guān)信息,該方法有幾個(gè)缺點(diǎn):一個(gè)是文件為線性結(jié)構(gòu),當(dāng)信息數(shù)量增多時(shí)不便查找;另一個(gè)是.in

50、i文件的文本格式限制了數(shù)據(jù)的格式和長(zhǎng)度;再一個(gè)是大量的.ini文件易造成混亂,也難以對(duì)數(shù)據(jù)保密。從Win95開(kāi)始,Windows采用注冊(cè)表保存系統(tǒng)信息,但為了兼容的目的仍保留了對(duì).ini文件的支持。 第第9 9章章 Win32Win32編程編程 注冊(cè)表本質(zhì)上是一個(gè)系統(tǒng)數(shù)據(jù)庫(kù)文件,它的內(nèi)部結(jié)構(gòu)是分層次的。該數(shù)據(jù)庫(kù)以特定格式保存各種配置信息。除了Windows用注冊(cè)表保存系統(tǒng)信息外,應(yīng)用程序也可以用注冊(cè)表保存信息。注冊(cè)表的文件保存在Windows文件夾內(nèi),一般由SYSTEM.DAT、USER.DAT等若干文件組成,這些文件為系統(tǒng)隱含文件。Windows提供了一個(gè)“注冊(cè)表編輯器”程序供用戶觀察、修改

51、注冊(cè)表。該程序文件名為RegEdit.exe,通常安裝在Windows文件夾內(nèi)??梢栽凇百Y源管理器”內(nèi)找到該文件,雙擊其圖標(biāo)運(yùn)行該程序。該程序運(yùn)行時(shí)的畫面如圖9-7所示。 第第9 9章章 Win32Win32編程編程 從圖9-7可以看出,注冊(cè)表的層次結(jié)構(gòu)類似于Windows文件系統(tǒng)的結(jié)構(gòu),“注冊(cè)表編輯器”的界面則與“資源管理器”很相似。習(xí)慣上將注冊(cè)表中各個(gè)層次的項(xiàng)目稱為鍵(Key),位于頂層一級(jí)的“HKEY_CLASSES_ROOT”、“HKEY_CURRENT_USER”等六個(gè)鍵被稱為根鍵(RootKey),每個(gè)根鍵與某一類設(shè)置信息對(duì)應(yīng)。鍵可以包含子鍵及值,每個(gè)值由值名稱和對(duì)應(yīng)的數(shù)據(jù)組成?!?/p>

52、注冊(cè)表編輯器”窗口左面部分用于顯示各級(jí)的鍵與子鍵,“+”、“-”按鈕用于打開(kāi)或折疊鍵。窗口右面部分用于顯示當(dāng)前鍵的各個(gè)值。從圖9-7中我們看到名稱為“Class”的值具有數(shù)據(jù)“System”,值名稱左側(cè)的圖標(biāo)指出其類型為字符串。第第9 9章章 Win32Win32編程編程 圖9-7 “注冊(cè)表編輯器”程序運(yùn)行時(shí)的畫面第第9 9章章 Win32Win32編程編程 9.4.2 TRegistry類 BCB中主要通過(guò)TRegistry類使用注冊(cè)表,使用TRegistry類的應(yīng)用程序項(xiàng)目應(yīng)包含Registry.hpp文件。 下面介紹TRegistry類的主要屬性和方法。 1Access屬性 Access

53、屬性用于在打開(kāi)注冊(cè)表的一個(gè)鍵時(shí)指定安全級(jí)別。 2CurrentKey屬性 CurrentKey屬性確定注冊(cè)表中當(dāng)前鍵。第第9 9章章 Win32Win32編程編程 3CurrentPath屬性 CurrentPath屬性指出注冊(cè)表中當(dāng)前鍵的完整路徑。 4RootKey屬性 RootKey屬性為TRegistry 對(duì)象指定根鍵,OpenKey等操作都與該屬性的設(shè)置有關(guān)。缺省的設(shè)置為HKEY_CURRENT_USER。 5CloseKey方法 CloseKey方法關(guān)閉當(dāng)前鍵。 6CreateKey方法 CreateKey方法創(chuàng)建一個(gè)新鍵。第第9 9章章 Win32Win32編程編程 7Delete

54、Key方法 DeleteKey方法刪除一個(gè)鍵。 8GetDataSize方法 GetDataSize方法返回當(dāng)前鍵值的長(zhǎng)度,單位是字節(jié)。 9GetDataType方法 GetDataType方法返回當(dāng)前鍵值的類型,返回值為rdUnknown、rdString、rdExpand-String、rdInteger、rdBinary之一。 第第9 9章章 Win32Win32編程編程 10GetKeyNames方法 GetKeyNames方法返回當(dāng)前鍵所有子鍵(不包含值)的鍵名,類型為字符串列表(TStrings)。 11GetValueNames方法 GetValueNames方法返回當(dāng)前鍵所有值

55、的名稱,類型為字符串列表(TStrings)。 12HasSubKeys方法 HasSubKeys方法是指當(dāng)前鍵有子鍵(不包含值)時(shí)返回值為true。第第9 9章章 Win32Win32編程編程 13KeyExists方法 KeyExists方法是指某特定鍵(不包含值)存在時(shí)返回值為true。 14OpenKey方法 OpenKey方法是指打開(kāi)注冊(cè)表的一個(gè)鍵。 15ReadInteger方法 ReadInteger方法是指從當(dāng)前鍵讀取一個(gè)指定值的整型數(shù)據(jù)。 16ReadBool方法 ReadBool方法是指從當(dāng)前鍵讀取一個(gè)指定值的布爾型數(shù)據(jù)。第第9 9章章 Win32Win32編程編程 17R

56、eadDate方法ReadDate方法是指從當(dāng)前鍵讀取一個(gè)指定值的日期型數(shù)據(jù)。18ReadFloat方法ReadFloat方法是指從當(dāng)前鍵讀取一個(gè)指定值的浮點(diǎn)型數(shù)據(jù)。19ReadString方法ReadString方法是指從當(dāng)前鍵讀取一個(gè)指定值的字符串型數(shù)據(jù)。20ReadTime方法ReadTime方法是指從當(dāng)前鍵讀取一個(gè)指定值的時(shí)間型數(shù)據(jù)。第第9 9章章 Win32Win32編程編程 21WriteInteger方法WriteInteger方法是指向當(dāng)前鍵的指定值寫入一個(gè)整型數(shù)據(jù)。22WriteBool方法WriteBool方法是指向當(dāng)前鍵的指定值寫入一個(gè)布爾型數(shù)據(jù)。23WriteDate方

57、法WriteDate方法是指向當(dāng)前鍵的指定值寫入一個(gè)日期型數(shù)據(jù)。第第9 9章章 Win32Win32編程編程 24WriteFloat方法WriteFloat方法是指向當(dāng)前鍵的指定值寫入一個(gè)浮點(diǎn)型數(shù)據(jù)。25WriteString方法WriteString方法是指向當(dāng)前鍵的指定值寫入一個(gè)字符串型數(shù)據(jù)。26WriteTime方法WriteTime方法是指向當(dāng)前鍵的指定值寫入一個(gè)時(shí)間型數(shù)據(jù)。第第9 9章章 Win32Win32編程編程 9.4.3 訪問(wèn)Windows系統(tǒng)信息 許多Windows系統(tǒng)信息都保存在注冊(cè)表內(nèi),通常它們存放的位置是固定的。有許多技術(shù)資料和參考書介紹注冊(cè)表上保存的各種Windo

58、ws信息的意義。這些值有的是只讀的,也有的可以修改(一般可用“注冊(cè)表編輯器”編輯這些值)。應(yīng)用程序有時(shí)需要讀寫這些值,在BCB中可以利用TRegistry類做到這一點(diǎn)。第第9 9章章 Win32Win32編程編程 下面我們介紹在程序中讀取計(jì)算機(jī)用戶和用戶單位名稱的方法,應(yīng)用程序與用戶 對(duì)話時(shí)可能要用到該名稱。該兩項(xiàng)名稱通常存放在注冊(cè)表中HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion鍵(或HKEY_LOCAL_MACHINE SOFTWAREMicrosoftWindows NTCurrent Version鍵)的名稱為Regis

59、teredOwner和RegisteredOrganization的兩個(gè)值內(nèi)。我們可以用下面的代碼讀取這兩個(gè)值后并把它們顯示到窗體的標(biāo)題上:第第9 9章章 Win32Win32編程編程 TRegistry* Registry = new TRegistry;Registry-RootKey = HKEY_LOCAL_MACHINE;Registry-OpenKey (SOFTWAREMicrosoftWindowsCurrentVersion, TRUE);AnsiString astr;astr = Registry-ReadString (RegisteredOrganization);a

60、str = astr +, +Registry-ReadString (RegisteredOwner);Form1-Caption = astr;要注意屬性RootKey的用法,另外不要忘記在程序中包含Registry.hpp文件。第第9 9章章 Win32Win32編程編程 9.4.4 保存應(yīng)用程序的信息 應(yīng)用程序可以選擇許多方式保存信息,如保存到文本文件、數(shù)據(jù)庫(kù)等,當(dāng)然也可以保存到注冊(cè)表。將應(yīng)用程序的信息保存到注冊(cè)表有以下的優(yōu)點(diǎn):節(jié)省保存到獨(dú)立文件所需要的磁盤空間;注冊(cè)表不像其它數(shù)據(jù)文件那樣容易被誤刪;注冊(cè)表的結(jié)構(gòu)很適合保存層次結(jié)構(gòu)的數(shù)據(jù);注冊(cè)表經(jīng)常地處于打開(kāi)狀態(tài)因此響應(yīng)速度較快;保存在注冊(cè)表內(nèi)的數(shù)據(jù)必要時(shí)可使用“注冊(cè)表編輯器”修

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論