2013-06-02 32 views
1

我正在開發一本字典。 我使用此代碼,從剪貼板中獲取文本。無法從c#上的剪貼板獲取非拉丁字符

[DllImport("User32.dll")] 
    protected static extern int SetClipboardViewer(int hWndNewViewer); 
    [DllImport("User32.dll", CharSet = CharSet.Auto)] 
    public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); 
    IntPtr nextClipboardViewer; 

    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     // defined in winuser.h 
     const int WM_DRAWCLIPBOARD = 0x308; 
     const int WM_CHANGECBCHAIN = 0x030D; 

     switch (m.Msg) 
     { 
      case WM_DRAWCLIPBOARD: 
       DisplayClipboardData(); 
       SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); 
       break; 
      case WM_CHANGECBCHAIN: 
       if (m.WParam == nextClipboardViewer) 
        nextClipboardViewer = m.LParam; 
       else 
        SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); 
       break; 
      default: 
       base.WndProc(ref m); 
       break; 
     } 
    } 
    internal void DisplayClipboardData() 
    { 
      bool isDataText = false; 
      IDataObject iData = new DataObject(); 
      iData = Clipboard.GetDataObject(); 
      if (iData.GetDataPresent(DataFormats.Text)) 
      { 
       textBox1.Text = (string)iData.GetData(DataFormats.Text); 
      } 
    } 

首先 - 我可以將我的鍵盤語言設置爲EN(英語)或BG(保加利亞語)。 當我將我的鍵盤語言設置爲EN並嘗試複製非拉丁字符時,會出現問題,然後我得到?????而不是正確的詞。如果我設置爲BG,我會得到正確的單詞。 我試圖從UTF-8和ANSII編碼的文件複製非拉丁文本,這是相同的,沒有區別,我只得到?????? (問號)

回答

2

嘗試使用Clipboard.GetText();而不是(string)iData.GetData(DataFormats.Text);,它應該以正確的格式(Text或UnicodeText)獲取文本。

+0

我綁定了'textBox1.Text = Clipboard.GetText(TextDataFormat.UnicodeText);'並且它正在工作 – vinsa

+1

根據操作系統的不同,您必須以UnicodeText或Text格式獲取文本。 'Clipboard.GetText();'會爲你選擇正確的格式,所以你應該使用這個方法。 –