LoginSignup
6
7

More than 3 years have passed since last update.

[Rust/WinRT] クリップボード操作

Posted at

Rust/WinRT でクリップボードを操作するコード例です. コードを実行した環境は以下の通りです.

  • Windows 10 v1909 build 18363.836
  • Rust 1.44.0 stable-x86_64-pc-windows-msvc

以下のコードのすべてで冒頭に winrt::import マクロによるモジュール生成および Clipboard, DataPackage の use が必要です (コード例からは省略します). なお DataPackage はコピー以外の操作では必要ないです.

winrt::import!(
    dependencies
        os
    types
        windows::application_model::data_transfer::*
);

use windows::application_model::data_transfer::{DataPackage, Clipboard};

基本編

文字列をコピー

fn main() -> winrt::Result<()> {
    let content = DataPackage::new()?;
    content.set_text("Rust🦀/WinRTによるクリップボード操作のテストです.\n改行も可能です.")?;

    Clipboard::set_content(content)?;
    Clipboard::flush()?;

    Ok(())
}

クリップボードに保存されている文字列を取得

取得できる文字列は winrt::HString 型です. 理論上これで動くはずなんですが, なぜか async を get() する部分で止まって動きませんでした… 動作報告あるいはバグの指摘等あればぜひ教えてください.

fn main() -> winrt::Result<()> {
    let content = Clipboard::get_content()?;

    for format in content.available_formats()? {
        // 可能な出力フォーマットを表示
        println!("{}", format);
    }
    // "Text" にフォーマットできない場合エラーとなる (画像など)
    let text = content.get_text_async()?.get()?;
    println!("{}", text);

    Ok(())
}

クリップボード履歴を取得

fn main() -> winrt::Result<()> {
    if !Clipboard::is_history_enabled()? {
        // クリップボード履歴機能が有効化されていない場合は以下の処理を実行せずに終了
        return Ok(());
    }

    let histories = Clipboard::get_history_items_async()?.get()?.items()?;

    for item in histories {
        // 中身の文字列 (HString 型) を取得 (async 関数だがここでブロック)
        let content = item.content()?.get_text_async()?.get()?;
        println!("{}", content);
    }

    Ok(())
}

クリップボードのアイテムを削除

最新のアイテムを削除

fn main() -> winrt::Result<()> {
    Clipboard::clear()
}

履歴からアイテムを削除

fn main() -> winrt::Result<bool> {
    let histories = Clipboard::get_history_items_async()?.get()?.items()?;

    let item = histories.get_at(2)?;
    Clipboard::delete_item_from_history(item)
}

履歴を全削除

fn main() -> winrt::Result<bool> {
    Clipboard::clear_history()
}

クリップボードを監視

コンパイルは通ったものの, 少しいじっても何も起こりませんでした. どうやって使うのでしょうか…

use windows::foundation::EventHandler;

fn main() -> winrt::Result<()> {
    Clipboard::content_changed(
        EventHandler::new(|_,_| {
            println!("Copy!");
            Ok(())
        })
    )?;
    Ok(())
}

参考文献

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7