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(())
}