1

ホットキー コンボの後に、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ことは素晴らしいことです。

4

3 に答える 3