アーカイブ

【Stream Deck】標準のテキストアクションで半角文字が打てないので自作してみた【Ver1.2】

StreamDeck標準のテキストアクションで半角テキストがうまく貼り付かないので代替プラグインを作成しました。

目次
  1. Stream Deckには標準でテキスト入力のアクションがある
  2. Stream Deck標準のテキストは半角文字の入力が上手くいかない場合がある
  3. テキスト入力プラグインを自作
    1. プロパティインスペクター
    2. 動作イメージ
    3. 作成手順
    4. 仕様
  4. ダウンロードはこちら
    1. 修正履歴
    2. 動作要件
  5. 課題
    1. クリップボードの復元が100%でない
    2. ExcelやWordだと挙動が安定しない
  6. おわりに

Stream Deckには標準でテキスト入力のアクションがある

Stream Deckには標準でテキスト入力アクションがあります。

「システム」カテゴリ内の「テキスト」です。

定型文を登録しておけば、長い文字列でもワンタッチで入力できるので、シンプルながら便利な機能です。

Stream Deck標準のテキストは半角文字の入力が上手くいかない場合がある

便利なテキスト入力機能ですが、以下条件下でうまく動作しませんでした。

  • IMEがGoogle日本語入力
  • 全角入力時
  • テキストが半角文字

このようなテキストを登録して実行すると・・・


なんじゃこりゃー何語?

どうやら挙動的にはキーを1文字ずつシミュレートしている模様・・・

WordPressのショートコード登録して使いたいと思っていたのでこれは困るゾイ・・・

ただこれ、全角という概念の世界の話なので、我々日本人とか全角使う言語圏の人しか困らない現象なんですよね。

テキスト入力プラグインを自作

じゃあ代わりのものを作るしかないじゃない!ということで作ってみました。

プロパティインスペクター

アイコンはやっつけで作成。設定項目はテキストだけ。

テキストは標準のアクションは500文字制限でしたが、制限はかけてません(単に忘れたので動作未確認)

動作イメージ

まぁ、テキストが貼り付くだけです。

先程の標準のテキストと同条件で実行しても正しく入力されます。

作成手順

以下記事をご覧ください。

仕様

  • Windowsのみ対応
  • キー押下時に設定したテキストをアクティブウインドウにペーストする
    ※KeyUp時

フロー

①設定値をクリップボードにコピーする

②Ctrl + V をキーシミュレートする

③クリップボードを復元する

ダウンロードはこちら

使用は自己責任でお願いします。

当サイトの プライバシーポリシー 内の「免責事項」の項をよくお読みください。

修正履歴

◯2023/09/08:Ver1.1

・ペースト先によってうまく貼り付けが行われない場合がある問題を改善しました。

◯2023/11/27 : Ver1.2

・Stream Deckアプリのバージョンによってインストールが失敗する不具合を修正しました。

・.NET Core3.1 のサポート終了にともなって、後継の.NET ランタイムに暫定対応

動作要件

OSWindows:10 ~ (x64)
※Windows 11は未検証
Mac OS:非対応
ソフトウェアStream Deckアプリ5.0~
その他・.NET Desktop Runtime 6.0 ~(※1)

※1.NETランタイムについて
アプリケーションのターゲットフレームワークは.NET Core 3.1ですが、ロールフォワード動作で後継のランタイムでの動作に対応しています。.NET Core 3.1、.NET 5はサポートを終了していますので、.NET 6~のインストールを推奨します。

ダウンロード、インストールは以下より
.NET ダウンロード (Linux、macOS、Windows)
※インストールしたいバージョンのリンクをクリック→.NET デスクトップ ランタイム X.X.X→x64

課題

クリップボードの復元が100%でない

一旦クリップボードにコピーを行う都合上、クリップボードの状態を実行前に完全に復元したかったのですが、どうやらそれをするのはかなり無理があるらしい…

クリップボードって色んな形式でデータを保持しているけれども、すべてが.NETで扱えるデータ形式なわけではないらしく、全ての形式に対応する汎用的な処理を作るのは無理なんだとか。

とはいえ、今の実装で、テキスト、HTML、画像、ファイルは保持できていることが確認できたので普通に使用する分には困らなさそう。

実装は以下

    public class PasteTextAction : BaseStreamDeckActionWithSettingsModel<Models.PasteTextSettingModel>
    {
        private readonly HashSet<string> DATAFORMATS_WHITELIST = new HashSet<string>
        {
            DataFormats.Bitmap,
            DataFormats.CommaSeparatedValue,
            DataFormats.Dib,
            DataFormats.Dif,
            //DataFormats.EnhancedMetafile,
            DataFormats.FileDrop,
            DataFormats.Html,
            DataFormats.Locale,
            //DataFormats.MetafilePict,
            DataFormats.OemText,
            DataFormats.Palette,
            DataFormats.PenData,
            DataFormats.Riff,
            DataFormats.Rtf,
            DataFormats.Serializable,
            DataFormats.StringFormat,
            DataFormats.SymbolicLink,
            DataFormats.Text,
            DataFormats.Tiff,
            DataFormats.UnicodeText,
            DataFormats.WaveAudio
        };
        public override async Task OnKeyUp(StreamDeckEventPayload args)
        {
            try
            {
                await base.OnKeyUp(args);
                Thread thread = new Thread(() =>
                {
                    try { 
                        IDataObject data = new DataObject();
                        IDataObject prev = Clipboard.GetDataObject();
                        if (prev != null)
                        {
                            string[] formats = prev.GetFormats();
                            foreach(string format in formats)
                            {
                                if (DATAFORMATS_WHITELIST.Contains(format))
                                {
                                    data.SetData(format, prev.GetData(format));
                                }
                            }
                        }
                        Clipboard.SetData(DataFormats.Text, SettingsModel.Text);
                        SendKeys.SendWait("^v");
                        Thread.Sleep(500); //Version1.1
                        Clipboard.SetDataObject(data, true);
                    } catch(Exception e)
                    {
                        Logger.LogError(e.Message);
                    }
                });
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
                thread.Join();
            }
            catch (Exception e)
            {
                Logger.LogError(e.Message);
            }
        }

    }

コメントアウトしている「DataFormats.EnhancedMetafile」形式でGetDataメソッドが走ると例外もはかれずアプリがクラッシュしてしまっていました。

リファレンスを見ると「特別な考慮事項が必要になる場合があります。」とかなんともきな臭い事が書かれていました。

とりあえず同じ注意書きがあった「DataFormats.MetafilePict」形式も対象外に。

その他は全部試せたわけではないので、クリップボードにコピーしている内容によってはクラッシュしてしまうかも。

ExcelやWordだと挙動が安定しない

ExcelやWordに対して実行すると、貼り付けれるときもあれば貼り付けられないときもありなんとも微妙な挙動。

クリップボード監視してるからかな?クリップボード履歴がいっぱいになったときに上手く行ってない気もする…気が向いたら調べよう。

2023/09/08 更新

どうやら単純な問題で、ペースト先でペースト処理のフックイベントが完了する前にクリップボードの復元が行われていたためうまくいっていなかった模様。

貼り付け~クリップボード復元までにディレイ処理を入れることで改善しました。

おわりに

StreamDeck、たのちいね~

プロフィール
筆者:UMAイカ

IT企業に勤務しています。
当ブログは商品レビューや生活の知恵、プログラミング、PCTipsなどについてお役立ち情報を発信します。趣味などの雑記も少し。
【マイブーム】:ウイスキー/自炊
【最近のひとこと】:転職したい・・・

- SNS -
アーカイブ