我有一个应用程序,在热键组合后它实际上“发送”一个 Ctrl+C 到前台窗口,将选定的文本发送到剪贴板。然后我需要从剪贴板中获取文本。这样做的代码如下:
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
private void CopyHighlighted()
{
uint KEYEVENTF_KEYUP = 2;
byte VK_CONTROL = 0x11;
SetForegroundWindow(GetForegroundWindow());
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(0x43, 0, 0, 0);
keybd_event(0x43, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, 0);
bool containsStuff = (Clipboard.ContainsAudio() || Clipboard.ContainsFileDropList() || Clipboard.ContainsImage() || Clipboard.ContainsText());
//The behavior changing MessageBox:
//MessageBox.Show("the clipboard contains some data: " + containsStuff.ToString());
string rawNumber = Clipboard.GetText();
MessageBox.Show("raw contents of clipboard " + Environment.NewLine + rawNumber);
}
如果MessageBox
注释了,我会弹出一个弹出窗口,上面写着“剪贴板包含一些数据:False”。这很奇怪,因为下一个弹出窗口显示“剪贴板 Clipboard.ContainsText() 的原始内容返回 false……但rawNumber
确实包含预期的文本。
但是当我评论第一个MessageBox
时,我只得到 1 个弹出窗口(如预期的那样),但它只说“剪贴板的原始内容”并且 rawNumber 是一个空字符串。
为什么包含此中间内容MessageBox
会导致我能够获取剪贴板文本?为什么在此之前Clipboard.ContainsText()
返回 false?任何有助于理解这一点,以及让它与 NO MessageBox
es 一起运行都会很棒。