史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2007-03-05, 01:45 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設 教學 - 剪貼簿複製、貼上 文字 for VB

VB.Net 個人不知
這裡適用的是 VB 6以下

一般來講VB要用
剪貼簿複製、貼上 的功能是
Clipboard.GetText
Clipboard.SetText
但如果你要複製的是 日文、簡中...等非 Big5碼 文字
一去一來下 就會多出幾個 ?號
因為使用Windows 2000/XP 時
系統 <-剪貼簿-> VB APP
剪貼簿會把文字在Unicode 跟ANSI 之間轉來轉去。
如此一些在 Big5字碼裡沒有的字碼
就會變成 ?號
(比如 ウェブ全体から検索 會變成 ???全体??検索)

那如何避免呢?
此時我們選擇捨棄VB的 剪貼簿類
改用API 來個記憶體運作
先看程式
PHP 語法:
Public Function ClipboardCopy_String(hwnd As LongstrText As StringMode As Integer)
Dim hMemory As Long     'handle
Dim lpMemory As Long    '
位址
    
If Mode 0 Then GoTo SETCLIP
 
    
'**獲取剪貼簿裡的字串
    If OpenClipboard(hwnd) Then '
開啟剪貼簿
        hMemory 
GetClipboardData(CF_UNICODETEXT'以UniCode文字格式獲取剪貼簿裡的字串
        If hMemory Then '
成功獲取的話
            lpMemory 
GlobalLock(hMemory'獲取該記憶體位址 (藉由handle),並鎖住該記憶體空間
            strText = Space(lstrlenW(lpMemory) * 2) '
配置給字串變數 一固定長度
            lstrcpyW StrPtr
(strText), ByVal lpMemory '將前面記憶體內容 複製到 字串變數裡
            GlobalUnlock hMemory '
解鎖記憶體位址
        End 
If
    
End If
    GoTo 
EXITFUN

    
'**將字串放入剪貼簿裡
SETCLIP:
    If OpenClipboard(hwnd) Then '
如果可以開啟剪貼簿的話
        EmptyClipboard 
'清空剪貼簿
        strText = strText & vbNullChar '
字串尾接一個API字串用 結束識別字元
        Mode 
LenB(strText'該字串的長度
        hMemory = GlobalAlloc(GHND, Mode) '
配置一個 記憶體空間,並獲得 控管ID
        
If hMemory Then '前一行可行的話...
            lpMemory = GlobalLock(hMemory) '
與之前敘述雷同
            lstrcpyW ByVal lpMemory
StrPtr(strText'與前敘述雷同,StrPtr是獲取字串之記憶體位址 之VB保留字
            GlobalUnlock hMemory '
與前敘述雷同
            SetClipboardData CF_UNICODETEXT
hMemory '設定hMemory控管的內容 給 剪貼簿,格式是UniCode文字
        End If
EXITFUN:
        CloseClipboard '
關閉剪貼簿的使用
    End 
If
End Function 
如何使用
Dim ts As String

ClipboardCopy_String 0, ts, 1 '得到剪貼板的字 到 ts
ClipboardCopy_String 0, ts, 0 '貼ts 到 剪貼板


ClipboardCopy_String 0, ts, 0
可以
Clipboard.SetText ts
替換之

P.S. 因為 ts 是Unicode格式, Unicode字串傳給 剪貼板 同樣都是Unicode,正常來說不會有 ?號 字元之問題產生,當然如要避免萬一,建議直接用 ClipboardCopy_String 會比較保險


這裡有用到不少 API函式 及 常數
以下請自行比對
PHP 語法:
Public Const GMEM_SHARE = &H2000
Public Const GMEM_MOVEABLE = &H2
Public Const GMEM_ZEROINIT = &H40
Public Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
 
 
 
Public Declare Function 
OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function SetClipboardData Lib "user32" _
    ByVal wFormat 
As Long_
    ByVal hMem 
As Long) As Long
Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
 
Public Declare Function GlobalAlloc Lib "kernel32" _
    ByVal wFlags 
As Long_
    ByVal dwBytes 
As Long) As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
 
Public Declare Function lstrcpyW Lib "kernel32" _
    ByVal lpString1 
As Long_
    ByVal lpString2 
As Long) As Long
 
Public Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
 
Public Const CF_TEXT 1
Public Const CF_ANSIONLY = &H400&
Public Const 
CF_APPLY = &H200&
Public Const 
CF_BITMAP 2
Public Const CF_DIB 8
Public Const CF_DIF 5
Public Const CF_DSPBITMAP = &H82
Public Const CF_DSPENHMETAFILE = &H8E
Public Const CF_DSPMETAFILEPICT = &H83
Public Const CF_DSPTEXT = &H81
Public Const CF_EFFECTS = &H100&
Public Const 
CF_ENABLEHOOK = &H8&
Public Const 
CF_ENABLETEMPLATE = &H10&
Public Const 
CF_ENABLETEMPLATEHANDLE = &H20&
Public Const 
CF_ENHMETAFILE 14
Public Const CF_FIXEDPITCHONLY = &H4000&
Public Const 
CF_FORCEFONTEXIST = &H10000
Public Const CF_GDIOBJFIRST = &H300
Public Const CF_GDIOBJLAST = &H3FF
Public Const CF_HDROP 15
Public Const CF_INITTOLOGFONTSTRUCT = &H40&
Public Const 
CF_LIMITSIZE = &H2000&
Public Const 
CF_LOCALE 16
Public Const CF_MAX 17
Public Const CF_METAFILEPICT 3
Public Const CF_NOFACESEL = &H80000
Public Const CF_NOSCRIPTSEL = &H800000
Public Const CF_NOSIMULATIONS = &H1000&
Public Const 
CF_NOSIZESEL = &H200000
Public Const CF_NOSTYLESEL = &H100000
Public Const CF_NOVECTORFONTS = &H800&
Public Const 
CF_NOOEMFONTS CF_NOVECTORFONTS
Public Const CF_NOVERTFONTS = &H1000000
Public Const CF_OEMTEXT 7
Public Const CF_OWNERDISPLAY = &H80
Public Const CF_PALETTE 9
Public Const CF_PENDATA 10
Public Const CF_PRINTERFONTS = &H2
Public Const CF_PRIVATEFIRST = &H200
Public Const CF_PRIVATELAST = &H2FF
Public Const CF_RIFF 11
Public Const CF_SCALABLEONLY = &H20000
Public Const CF_SCREENFONTS = &H1
Public Const CF_BOTH = (CF_SCREENFONTS Or CF_PRINTERFONTS)
Public Const 
CF_SCRIPTSONLY CF_ANSIONLY
Public Const CF_SELECTSCRIPT = &H400000
Public Const CF_SHOWHELP = &H4&
Public Const 
CF_SYLK 4
Public Const CF_TIFF 6
Public Const CF_TTONLY = &H40000
Public Const CF_UNICODETEXT 13
Public Const CF_USESTYLE = &H80&
Public Const 
CF_WAVE 12
Public Const CF_WYSIWYG = &H8000 

此帖於 2017-12-18 02:44 PM 被 mini 編輯.
mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
有 4 位會員向 mini 送花:
getter (2007-03-06),tmail1987 (2008-01-31),劍痞憶秋年 (2007-03-07),飛鳥 (2007-03-05)
感謝您發表一篇好文章
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 02:45 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1