<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ### **剪切板** ***** 系統維護的一個全局公共內存區域.每次只允許一個進程對其進行訪問。 剪切板操作方法如下:(MSDN上搜索 Clipboard Operations) ### 操作步驟 ***** **1.打開剪切板** ``` Bool OpenClipboard(HWND hWndNewOwner); ```   指定關聯到打開的剪切板的窗口句柄,傳入NULL表示關聯到當前任務。每次只允許一個進程打開并訪問。 每打開一次就要關閉,否則其他進程無法訪問剪切板。 **2.清空剪切板** ``` Bool EmptyClipboard(void) ```   寫入前必須先清空,得到剪切板占有權 **3.分配內存** ``` HGLOBAL GlobalAlloc(UINT uFlags, SIZE\_T dwBytes); ```   在堆上動態分配以字節為單位的內存區域。成功則指向該內存,失敗NULL。參數:1.分配內存屬性, 2.分配的大小 **4.鎖定內存** ``` LPVOID GlobalLock(HGLOBAL hMem); ```   鎖定由**GlobalAlloc**分配的內存,并將內存對象的鎖定計數器+1,成功返回指向內存對象起始地址的指針。失敗NULL 系統為每個全局內存對象維護一個鎖定計數器,初始為0,**GlobalLock**使計數器+1,**GlobalUnLock**計數器-1.一旦計數器值大于0, 這塊內存區域將不允許被移動或刪除,只有當為0時,才解除對這塊內存的鎖定。如果分配時**GMEM\_FIXED**屬性,計數器一直為0 **5.設置剪切板** ``` HANDLE SetClipboardData(UINT uFormat, HANDLE hMem); ```   執行成功,返回數據句柄,否則返回NULL 6.**解除鎖定 ** ``` BOOL GlobalUnlock(HGLOBAL hMem); ```   將GlobalAlloc分配的屬性為GMEM\_MOVEABLE的內存對象計數器-1. 7.**關閉剪切板 ** ``` Bool CloseClipboard(void); ```   必須關閉剪切板其他進程才能使用剪切板,且關閉后當前進程就不能寫入數據。 8.**獲取剪切板數據** ``` HANDLE GetClipboardData(UINT uFormat); ```   執行成功,返回數據句柄,否則返回NULL數據格式,指定格式的數據的句柄 一:UINT uFormate格式說明:***標準剪貼簿數據格式*** Windows支持不同的預先定義剪貼簿格式, 這些格式在WINUSER.H定義成以CF為前綴的標識符。 ■三種能夠儲存在剪貼簿上的文字數據型態: > **①CF\_TEXT**??? 以NULL結尾的ANSI字符集字符串。它在每行末尾包含一個carriage? return和linefeed字符,這是最簡單的剪貼簿數據格式。 >**②CF\_OEMTEXT**??? 含有文字數據(與CF\_TEXT類似)的內存塊。但是它使用的是OEM字符集。 >**③CF\_UNICODETEXT**??? 含有Unicode文字的內存塊。與CF\_TEXT類似,它在每一行的末尾包含一個carriage? return和linefeed字符,以及一個NULL字符(兩個0字節)以表示數據結束。**CF\_UNICODETEXT**只支援Windows NT。 ■兩種附加的剪貼簿格式、但是它們不需要以NULL結尾,因為格式已經定義了數據的結尾。 >**①CF\_SYLK**    包含[Microsoft](https://www.baidu.com/s?wd=Microsoft&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd)「符號連結」數據格式的整體內存塊。這種格式用在Microsoft的Multiplan、Chart和Excel程序之間交換數據,它是一種ASCII碼格式。 >**②CF\_DIF**??? 包含數據交換格式(DIF)之數據的整體內存塊。用于把數據送到[VisiCalc](https://www.baidu.com/s?wd=VisiCalc&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd)電子表格程序中。這也是一種ASCII碼格式 ■下面三種剪貼簿格式與位圖有關。所謂位圖就是數據位的矩形數組 >**①CF\_BITMAP**??? 與設備相關的位圖格式。位圖是通過位圖句柄傳送給剪貼簿的。 >**②CF\_DIB**??? 定義一個設備無關位圖的內存塊。 >**③CF\_PALETTE**??? 調色盤句柄。 ■下面是兩個metafile格式、metafile就是一個以二進制格式儲存的畫圖命令集 >**①CF\_METAFILEPICT**??? 以舊的metafile格式存放的「圖片」 。 >**②CF\_ENHMETAFILE**??? 增強型metafile(32位Windows支持的)句柄。 ■最后介紹幾個混合型的剪貼簿格式: >**CF\_PENDATA**與Windows的筆式輸入擴充功能聯合使用。 >**CF\_WAVE**聲音(波形)文件。 >**CF\_RIFF**使用資源交換文件格式(Resource Interchange File Format)的多媒體數據。 >**CF\_HDROP**與拖放服務相關的文件列表。 二:**UINT uFlags**格式說明:內存屬性 **GMEM\_FIXED** >分配一塊固定的內存區域,不允許系統移動,這時返回值是一個指針。 **GMEM\_MOVEABLE** >分配一塊可移動的內存區域,實際上內存塊在物理內存中是不可移動的,這里的可移動指的是在應用程序的默認邏輯堆內可以移動。返回值是內存對象的句柄。可以通過調研GlobalLock()函數將一個句柄轉化為一個指針,這個標志不能喝GMEM\_FIXED?同時使用 **GMEM\_ZEROINT**?   >初始化內存對象為全0,如果不用這個標志,內存對象將為不確定的內容 **GHND** >**GMEM\_MOVEABLE**和**GMEM\_ZEROINT**塊標志聯合使用,即可移動同時初始化為0 **GPTR** >**GMEM\_FIXED**和**GMEM\_ZEROINT**標志聯合使用,即不可移動同時初始化為0 ***** **設置剪切板數據** ``` void CMFC_TabCtrlDlg::SetClipBoardData_(CString strText) { /* OpenClipboard打開剪切板:指定關聯到打開的剪切板的窗口句柄,傳入NULL表示關聯到當前任務。每次只允許一 個進程打開并訪問。每打開一次就要關閉,否則其他進程無法訪問剪切板。 EmptyClipboard清空剪切板:寫入前必須先清空,得到占有權 */ if (::OpenClipboard(m_hWnd) &&::EmptyClipboard()) { //根據環境變量獲取數據長度 size_t cbStr = (strText.GetLength() + 1) * sizeof(TCHAR); //在堆上動態分配以字節為單位的全局內存區域。成功則指向該內存,失敗NULL。參數:1.分配內存屬性,2.大小 HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, cbStr); if (hMem == NULL) { //關閉剪切板,釋放剪切板所有權,關閉后就不能寫入數據 CloseClipboard(); return; } //鎖定由GlobalAlloc分配的內存,并將內存對象的鎖定計數器+1;成功返回指向內存對象起始地址的指針。失敗NULL LPTSTR lpDest = (LPTSTR)GlobalLock(hMem); /* 系統為每個全局內存對象維護一個鎖定計數器,初始為0,GlobalLock使計數器+1, */ //拷貝數據到剪貼板內存。 memcpy_s(lpDest, cbStr, strText.LockBuffer(), cbStr); strText.UnlockBuffer(); //解除內存鎖定,將屬性為GMEM_MOVEABLE的內存對象計數器-1. GlobalUnlock(hMem); /* GlobalUnLock計數器-1.一旦計數器值大于0,這塊內存區域將不允許被移動或刪除,只 有當為0時,才解除對這塊內存的鎖定。如果分配時GMEM_FIXED屬性,計數器一直為0 */ //根據環境變量設置數據格式 UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR))?CF_UNICODETEXT:CF_TEXT; //設置數據到剪貼板。執行成功,返回數據句柄,否則返回NULL if(SetClipboardData(uiFormat, hMem) == NULL); { CloseClipboard(); return; } CloseClipboard(); } } ``` **讀取剪切板數據** ``` void CMFC_TabCtrlDlg::GetClipBoardData_(void) { //if (IsClipboardFormatAvailable(CF_UNICODETEXT)) //判斷某種格式的數據是否可用 if(::OpenClipboard(m_hWnd)) { UINT uiFormat = (sizeof(TCHAR) == sizeof(WCHAR))?CF_UNICODETEXT:CF_TEXT; ////執行成功,返回數據句柄,否則返回NULL。參數:1.數據格式,2.指定格式的數據的句柄 HGLOBAL hMem = GetClipboardData(uiFormat); if (hMem != NULL) { //獲取UNICODE的字符串。 LPCTSTR lpStr = (LPCTSTR)GlobalLock(hMem); if (lpStr != NULL) { SetDlgItemText(IDC_EDIT1, lpStr); } GlobalUnlock(hMem); } } CloseClipboard(); } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看