无法从c#上的剪贴板中正确获取非拉丁字符

时间:2013-06-02 20:31:47

标签: c# character-encoding clipboard non-latin

我正在开发一本字典。 我正在使用此代码从剪贴板中获取文本。

    [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编码的文件中复制非拉丁文本,它是一样的,没有区别,我只得到了?????? (问号)

1 个答案:

答案 0 :(得分:2)

尝试使用Clipboard.GetText();代替(string)iData.GetData(DataFormats.Text);,这样可以获得正确格式的文本(Text或UnicodeText)。