0

私は基本的にコピー機であるアプリケーションを持っていますが、それはもっと多くのことができます。私が乗り越えられないのはこれです:

ユーザーがいくつかのファイル (エクスプローラー、デスクトップ、または Windows の任意の場所) を選択したときにアプリケーションを開きたいのですが、選択したすべてのファイルはキャッシュなどにある必要があり、リストなどに表示されます。

これは Windows によって行われるため、その必要はありません。ユーザーが選択したいすべてのファイルを選択してコピーした場合、ユーザーがそのファイルを別の場所に貼り付けたときにアプリケーションを実行するにはどうすればよいですか? 自動で開くように?

私はこれを持っています:

[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;
    }
}

void DisplayClipboardData()
{
    try
    {
        IDataObject iData = new DataObject();
        iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Rtf))
        {
            richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);
        }
        else if (iData.GetDataPresent(DataFormats.Text))
        {
            richTextBox1.Text = (string)iData.GetData(DataFormats.Text);
        }
        else
        {
            richTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";
        }


    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
    }
}

ただし、これはテキストが選択されている場合にのみ機能します。各ファイルのファイルディレクトリを表示するにはどうすればよいですか?

4

2 に答える 2

1

貼り付け (Ctrl+V) 操作ではなく、コピー (Ctrl+C) または切り取り (Ctrl+V) 操作に反応したい場合、実際には比較的単純です。
必要なのはクリップボードを監視することだけです。なぜなら、この情報がそこにあるからです。リッスンする必要があるデータ形式はFileDrop.

残念ながら、WinAPI を使用してクリップボードの変更をリッスンする必要があります。

このような変更を受け取ったら、コピーされたファイルのリストを次のように取得できます。

void DisplayClipboardData()
{
    if(!Clipboard.ContainsFileDropList())
        return;

    var fileList = Clipboard.GetFileDropList();
    // Do something with the file list.
}
于 2013-02-14T09:45:06.503 に答える
0

私はあなたが2つのことをしなければならないと思います:

1) SetWindowsHookExを使用して、Windows のキーボードとマウスのイベントに接続します。これは、winform アプリケーションの例です。

2)クリップボードの内容を確認し、必要なことを行います

このアプローチの主な点は、キーボード イベントをリッスンするフックをスレッドに関連付ける必要があるため、イベントを受信するために、アプリケーションが既に読み込まれており、メモリに常駐している必要があります。制限付きの GUI を作成して、システム トレイにアイコンを配置することもできます。

編集:Windowsフックに関するMSDNの概要

于 2013-02-14T09:59:29.700 に答える