torazaemon2016’s blog

手書き文字認識メモ開発

ノートPC(1stマシン)にSyncTrayzorをインストール

素のままのSyncthingを用いるのも良いですが、Windowsには SyncTrayzorというソフトがあり、使い勝手が良いので、こちらをインストールします。

1. インストール

https://github.com/canton7/SyncTrayzor より

Installer

Download SyncTrayzorSetup-x64.exe or SyncTrayzorSetup-x86.exe and run it. If you already have SyncTrayzor installed, this will update it.

をクリックすると、Setup.exeファイルのあるgithubのページに移動しますので、 SyncTrayzorSetup-x64.exe をクリックしてダウンロードしてください(もうx64 64bit OSの話だけどしていいですよね?) なお、このx64版は、ARM WindowsではSetupが起動しない(エラーになる)ので、ARMではPortable版を利用してください。(ARM PCでの話はまたいつか)

ダウンロードしたSyncTrayzorSetup-x64.exeを起動すると、OSが警告してきますが、「はい」して実行すると、以下のような画面になりますので、基本「Next」「Install」「Next」「Finish」

Synctingが起動してくるので、しばらく待つと、

Syncthingが起動したGUI画面になります。 レポートを送るか?と聞かれるので、「No」を選択します。

設定

GUI画面へのパスワード設定を聞かれますが、とりあえず今はOK押して、あとで設定することにします。

右上で「言語」を選択します。「English」から「japanese」にすると、表示が日本語になります。

メニュー

右上にあるメニューをクリックして、プルダウンメニューを表示させます。

2. ネットワーク設定

メニューから「設定」を選択すると、次のウィンドウが表示されます。

上部の「接続」を押して、ネットワークについて設定します。

最初は「4つとも ☑が入った状態で「インターネットと通信する」設定になっていますので、これを「LAN内で探索」のみにして、保存ボタンを押します。

まずは、ノートPC(1stマシン)でのインストールとネットワーク設定は、ここまで。

他にもメニューにいろいろとありますので、また見てみてください。 (GUI画面のパスワードなども設定してみてください)

次は1. インストール編

3,4. iPadmini(2ndマシン)にMöbius Syncをインストール - torazaemon2016’s blog

WindowsノートPCとiPadminiの間をSyncthingでデータ同期(SyncTrayzorとMöbius Syncを使って)

はじめに

Syncthingのページを書いてから1年経って、ObsidianのVaultを、Windowsを中心として, iPhone, iPad, Androidでの共有や、iPhoneの写真を手軽にWindowsへなど、毎日便利に使えています。

1年過ぎてもSyncthingがあんまり広がっていない気がするので、 そこでセットアップ方法をまとめてみたのと合わせて、アップデートした情報のページを作成しました。

キーワード: Syncthing, SyncTrayzor, Möbius Sync, Synctrain, iOS, 無料, Obsidian

Syncthing

https://syncthing.net/
クラウドのストレージサービスや別途NASを用意することなく、コンピュータ間のファイルを直接的に同期することで、端末間で気軽にフ ァイル共有できるソフトウェアが「Syncthing」です。 「外部のクラウドのストレージサービスを利用するのはセキュリティなどが心配 」と思うような場合や、もっと簡単にスマフォとノートPCの2台間で共有したいだけなどのときに、手軽に共有することが可能になる仕組みです。
Syncthing自体はオープンソースのもので、WindowsLinuxmacOS以外にも、Android上でも動作します。

2025-08-28 追記:

SyncthingがVersion 2になりました (2025-08-12)(https://forum.syncthing.net/t/syncthing-v2-0-0-2025-08-12/24758)

Version2でデータベースがSQLiteになったり、APIが整理されたりと、大きく変わったようです。

SyncTrayzor

素のままのSyncthingソフトを用いるのも良いですが、Windowsには SyncTrayzorというソフトもあります。 SyncTrayzorは、

  • 簡単にSyncthingをインストールできる

  • 同じファイルをそれぞれのクライアントで編集して競合(Conflict)が発生した場合、それを知らせてくれる機能がある

など、単体のSyncthingよりもずっと使いやすくなっているソフトです。

残念ながら開発が止まっており、WWWページに行くと、 https://github.com/canton7/SyncTrayzor

⚠️ SyncTrayzor is unmaintained ⚠️

I stopped using Syncthing some years ago, and I'm afraid I don't have the time to maintain it. Sorry.

It looks like Syncthing 2.0 makes backwards-incompatible changes, which break SyncTrayzor. If you feel like forking it, please do. Otherwise, I can recommend Syncthing Tray.

となっていて本元Syncthingが2.0にバージョンアップしたときは、使えなくなるみたいですが、Conflictを知らせてくれる1点だけで、このソフトを使う価値があります。 上で紹介されているSyncthing Trayのほうも、インストールしやすくSyncthingの状態やエラーも表示してくれるようなのですが、Conflictを知らせてくれるものではないようので、まだしばらくはSynctrayzorを使っていくことになります。

2025-08-28 追記:

Synctrayzorも元のものからForkして、V2になりました。 https://github.com/GermanCoding/SyncTrayzor?tab=readme-ov-file

Note This is SyncTrayzor v2, a continuation of the (discontinued) original SyncTrayzor by @canton7 (Antony Male)

V2で正式にARM64版も公開されました。

Synctrayzor 2.0.1 + Syncthing 2.0.3 で、これまでのように競合を知らせてくれます。 (Syncthing 2.0.0ではConflictはうまく表示されなかったですが、2.0.3でできるようになってましたので、インストールしたらバージョン番号の確認を)

arm64マシンにもインストールして、問題なく動作しています。

Möbius Sync

iOS向けの(有料)アプリです。 Syncthingとほぼ同じGUIなので、設定方法なども同じにできます。

無料で使える分には、Möbius Syncフォルダのサンドボックス内のフォルダ(ファイル)だけがコンピュータ間で共有なので、iOSでの他のアプリのファイルの場所を、Möbius Syncのフォルダ内に設定できるものでないと、実用的には使えないです。

有料版では、Möbius Sync以外のフォルダ(例えばObsidianアプリでのObsidianフォルダ以下のVaultフォルダ)にアクセス可能になるので、Obsidianの有料サービスのSyncを使わなくても、ファイルをWindowsiOSで共有できます。 また、iOSの写真フォルダ(Photoフォルダ)も、iPhoneからWindowsへの方向のみとなりますが、共有できるので、撮った写真をすぐにWindowsで見ることができます。

Synctrain

iOSには、有料のMöbius Syncしかない状態でしたが、2024年9月あたりからSynctrainというアプリが登場し、2025年2月あたりから日本でもインストールして利用することができるようになりました

torazaemon2016.hatenablog.jp

無料で利用できるので、Windows + iPhone(iPad)なら、SyncTrayzorとSynctrainの名コンビの登場となるかと思います。

ただ、インタフェースがWebインタフェースではなく、iOS風になっています。 基本syncthingなので、同期の仕方や設定の考え方など、Windows版等でのsyncthingのしくみを理解してから使ってみると、わかりやすいです。


以下、WindowsマシンとiOSマシンでのインストールから設定の方法についてまとめたページです。

SyncTrayzorとMöbius Syncのインストール話

torazaemon2016.hatenablog.jp

iOSで無料のSyncthing「Synctrain」をインストールして使ってみる

Synctrain

Synctrain

  • T-Shaped
  • 仕事効率化
  • 無料
apps.apple.com

Synctrainは、SwiftUI で作られたiOS用 Syncthingクライアントです。

Synctrainの最大の魅力は「無料」であること。 iOS版ではこれまでなかったSyncthingの無料アプリになります。 少なくとも現時点では、開発者の方の方針が有料よりは無料でというようなので、非常に期待できるアプリです。

Möbius Sync と違い、SwiftUIでの設定画面のため、戸惑いやすかったので書いてみました。

Möbius Sync

Möbius Sync

Möbius Sync

  • Pickup Infinity Limited
  • 仕事効率化
  • 無料
apps.apple.com

なお、Syncthingの仕組みを知っておかないと、設定ができないので、下記記事も参考にしてください。 torazaemon2016.hatenablog.jp

(この記事では上記記事を前提に、2nd側のiOS側の話中心で、 1st側のノートPCでのことは上記で理解して設定できるとして、簡単にしか書いていません)

1. インストール編

ここでは、iPad miniにインストールしたときのを説明します。

Synctrain

Synctrain

  • T-Shaped
  • 仕事効率化
  • 無料
apps.apple.com からインストール

画面

  • 起動後最初のStart画面

  • 設定画面(Start画面の右上の「歯車」を押す)

  • 左側のDevices画面(まだ登録がない)

初期設定(ネットワーク設定)

Möbius syncのときと同じで、ローカルネットワークだけの接続にする

Settings(設定画面)での「Advanced settings」にて

DISCOVERYについて

  • 「Announce on local networks」「Announce LAN addresses」のみON
  • NETWORK TRAVERSALのものをすべてOFF

2. 接続編(デバイスを追加する)

SyncthingでQRコードで追加したのと同様に行う。

Devices画面で「+ Add device...」を押す

「Scan using camera」を押す

カメラでノートPC側のQRコードを写して

バイスIDを取得

バイスが登録された

ノートPC側でもiPadminiを追加して、マシン間で接続ができると、Display nameなども自動で取得された

syncthing同士ならここまででネットワーク的に接続されるような表示になったりしたのですが、 Synctrainでは、次のフォルダの指定をしないと、緑の接続がつながった表示(Connected)にならない感じもあります。

なんだかんだでつながったりもしたので、単に時間が掛かっただけかもしれませんが、 つながったか不明な状態でもフォルダ共有設定に進んでみてください。 (Display nameが自動でセットされた段階で接続はされたことがあるはずです)

3. フォルダ同期編

例としてdefaultフォルダを共有

ノートPC側のDefaultフォルダを共有OKにしたのち

SyncTrainのDevicesでノートPC側の「SHARED FOLDERS」の共有設定で☑入れた「default」をONにする

接続され共有された(今回中身がないのでno files)

sampleフォルダを共有 (パターンA)

同様に、1stノートPC側(共有元)で「フォルダ名『sample』フォルダID『gsqgq-sgqde』」を、2nd「iPadmini」に対して共有に☑を入れると、

iPadmini側に「+ gsqgq-sgqde」フォルダが追加される 「+ gsqgq-sgqde」を押す

Add folder画面

FOLDER ID

  • 変更しちゃダメ
  • この名前でFoldersに並ぶ下の方で説明するFolder Settingでの Display nameの欄につけた名前でFoldersに並ぶ

  • 下のSelect exsisting folderで、他のアプリのフォルダ指定することは可能だけど、ノートPC側のフォルダを識別するためにユニークなIDである必要ということのよう

  • (共有元のSyncthingで指定したフォルダ名にはならないので、とても使いにくいので将来バージョンアップで修正してほしい)

FOLDER LOCATION

  • 「Create a new folder」Synctrainフォルダの中に「FOLDER ID」の文字列のフォルダが作られる (上の変更しちゃダメっていうやつ。ノートPC側で設定したフォルダIDに対応するフォルダ名の文字列ではない)
  • 「Select existing folder」Synctrainフォルダ外のフォルダを指定することで、他のアプリケーション(Obsidianなど)と共有可能になる

Synchronize

  • Selected files にすると、ファイル毎に選択しないと共有(同期)されない
  • All files でほとんどの場合、いいような気がする

SHARE WITH

  • ここでデバイスIDが出ているので、共有するマシンをONにする

(なお、ここでの設定は、このあとの説明にあるように他の場所でも変更可能)

Add folder画面でのが終わると、右上の「Add folder」を押す (ほとんど変えずに「Add folder」する)

SHARE WITHをまだONにしていない状態

「Devices」押して、ノートPCへの設定情報を表示

Devicesで右側の下部のほうでSHARED FOLDERSをONにして Connectedする。

右上の〇…を押すと

一番下の「Folder settings」を選択

ここで「Selection」を変更できる

ここでDisplay nameを変更可能だが、単なるSynctrainの左側一覧が変わるだけで、実際のフォルダ名がこれになるわけではない。 Display nameの欄につけた名前でFoldersに並ぶので、わかりやすい名前に修正しておくのも手だが、

結論としては、「FOLDER ID」は、共有元のノートPCの方で共有設定するときに、そこでフォルダIDとフォルダ名を同じにして、わかりやすいユニーク(固有)な文字列にして付けたほうが、Synctrainでは名前がわかりやすくなるのかと思われる。 (個人で使う分には複数フォルダの名前が重複しないよう管理できるでしょう)

Select existing folderでObsidianのVaultを共有(同期)可能にする(パターンB)

1st(ノートPC)側で Obsidianのvaultフォルダを共有設定して共有☑入れる(フォルダIDが「x2enn-2kotb」)

2nd(iPadmini)側で、「+ x2enn-2kotb」が追加されてくるので、押す

Add folderで「Select existing folder」選択

フォルダ選択画面になるので、「このiPad内」の「Obsidian」(Obsidianアプリを入れると作られるフォルダ)を選択してObsidianアプリのフォルダの中に入る。

ここ(「このiPad内」->「Obsidian」中)で、「(空いたところで長押しでメニュー出して「新規フォルダ」で)『obsidiain』フォルダを作って」、それを押して、「obsidian」の中に入ったのちに右上の「開く」を押す。

(「このiPad内」->「Obsidian」->「obsidian」という階層構造)

「開く」を押した結果(✔Existing folder: 'obsidian')で

Synchronizeを「All files」に変更して、右上の「Add folder」を押す

「Continue」を押す

追加された(「x2enn-2kotb」が+から📁アイコンに)

Devicesで共有元のデバイスでのSHARED FOLDERSで今回追加した該当するフォルダ「x2enn-2kotb」をONに

共有(コピー)されていく

基本Syncthingなので、1st(ノートPC)側でのSyncthingでの仕組みや設定を、よく理解していれば、 Synctrainの設定も可能かと思います。

SynctrainでiOSの写真を共有

iPadminiのPhotoを同期(コピー)する。

SynctrainでのPhotoの共有は、Möbius Syncとは違い、直接Photoのフォルダを扱うのではなく、一度 Synctrainのローカルフォルダに写真ファイルなどをコピーして、コピーしたファイルを共有する形になる。 そのため、iPad(iPhone)に空き容量がその分必要になる。 また、新しい写真を撮ったときは、それを追加するというアクションが必要となる。

写真共有用フォルダを作成

左の「+ Add folder...」を押して、FOLDER IDの文字列を指定(今回は「iPadminiPhotos」)して、「Create a new folder」で追加する、(All files設定なども忘れずに指定)

Settings(設定画面)にて初期設定

(上記でiPadminiPhotosフォルダが追加されている状態で) SettingsのPhotos synchronization を選択

COPY PHOTOSの「To folder」を設定する。

iPadminiPhotosを指定

Start画面で「Copy new photos」を押して、

写真を共有フォルダの「iPadminiPhotos」フォルダにコピー

FILES(ファイル)アプリで見ると、日付ごとのフォルダが生成されている

1st(ノートPC)側において、2nd(iPadmini)のを受け入れる設定を行うと、共有(同期)が進む

同期した

このあとも、新しい写真を撮ったら、「Start」画面を出して「Back-up new Photos」 (もしくはCopy new photos)を押してコピーすることで、iOSのPHOTOフォルダからSynctrainのフォルダにコピーして、それをSyncthingで同期するとなっていく。

おわりに

Settingsのほうで「periodically in the background」をONにすることで自動にすることもできるみたいや、 「Copy new photos」を押したのに、新しい写真が同期しないなどのときは、一度 Synctrainを終了して、再度立ち上げるとうまく行く。 そもそも写真を別なフォルダにコピーするので容量が必要など、Synctrainにはやや癖(不具合?)がありますが、バージョンアップによってどんどん良くなっていくといいなと思います。

SyncTrayzorとMöbius Syncのインストール話

2台のマシンによるファイル同期

Syncthingのインストール記事はたくさんWWWに出ていますが、全体像がややわかりにくく、今何の話しているのか、わかりにくい感じでした。

そこで、この記事では、一般的な家庭を想定して、WiFi無線LAN装置があって、無線LAN装置がローカルにDHCPでローカルIP接続して、スマートフォンとかノートPCをWiFiで繋いている環境を想定し、また、ファイル同期は、外部とは接続しない(外部と通信しない)設定にして、セキュリティリスクを避けて運用する方法とします。

なので、スマートフォンで外部から自宅のパソコンとファイル同期という形ではなく、同じ家(部屋)にあるスマートフォンとノートPCでファイルを同期するという話になります。

以下では、WindowsノートPCとiPad miniとの間でSyncthingによるファイル同期を行う例として説明します。 ノートPCを1stマシン、iPadminiを2ndマシンと呼ぶことにします。

最初に、1st, 2ndマシンそれぞれにアプリのインストールを行い、両マシンがネットワーク的につながったら、1stマシンのフォルダーを2ndマシンへコピーして、その後フォルダ内のファイルを同期し続けるイメージと考えていただけると、わかりやすくなるかと思います。

インストールや設定の手順の3つのステップ

1. インストール編:

  1. ノートPC(1stマシン)にsyncthingソフトをインストール
  2. ノートPCのsyncthingの設定(ネットワーク設定)
  3. iPadmini(2ndマシン)にsyncthingアプリをインストール
  4. iPadminiのsyncthingの設定(ネットワーク設定、iOS設定)

2. 接続編:

  1. ノートPC(1stマシン)において、デバイスIDのQRコードで表示
  2. iPadmini(2ndマシン)において、iPadのカメラでノートPCのQRコードを読み込むことで、ノートPC(1stマシン)のデバイスIDを登録
  3. ノートPC(1stマシン)にiPadminiの接続が表示されてくるので、それを許可する

3. フォルダ同期編:

  1. ノートPC(1stマシン)において、同期するフォルダの指定
  2. ノートPC(1stマシン)にて、同期するフォルダをiPadmini(2ndマシン)への許可を出す
  3. iPadmini(2ndマシン)において、ノートPCの同期するフォルダが見えてくるので、iPadminiのどこに保存するかを設定
  4. 同期するフォルダの共有が開始(1stから2ndへのコピー)

この流れ(1st,2ndマシンでの順番)で、以下に説明します。

1. インストール編

1,2. ノートPC(1stマシン)にSyncTrayzorをインストール - torazaemon2016’s blog

3,4. iPadmini(2ndマシン)にMöbius Syncをインストール - torazaemon2016’s blog

2. 接続編

1,2,3. SyncTrayzorとMöbius Syncの接続編 - torazaemon2016’s blog

3. フォルダ同期編:

1,2,3,4. SyncTrayzorとMöbiusSyncの同期フォルダ編 - torazaemon2016’s blog

これで、2つのマシンの間でファイルの共有が可能になりました。


SyncTrayzorでのConflictの話

torazaemon2016.hatenablog.jp

MöbiusSyncでPhotoの共有の話

torazaemon2016.hatenablog.jp

AutohotkeyでGUIメニューを表示し、ペン1本で PCを操作する Ver.2

Autohotkeyを使ってGUIメニューを出すことでキーボードがなくてもPCを操作する環境を作る。(Ver.2)

前にこの話を書いて、そろそろちょうど1年なので、現在の状況にUpdateします。

今はこんなふうになっています。

カテゴリごとに色分け

前回の記事: torazaemon2016.hatenablog.jp

2025/11/21:3回目のUpdateも行っています。 torazaemon2016.hatenablog.jp

Autohotkey Ver.2 で、ボタンに色を付ける

GUI要素のButtonにColorを付けようとしてみて、 いろいろとググってみましたが、標準ではボタンの色の変更ができないようでした。

いろんな人が拡張ライブラとして作成していて、Githubなどに出ているものなどをやってみましたが、 Win32をガリガリたたいて大変そうなのと、ahkファイルとしても、1つ1つのボタンに色を付ける設定が結構面倒だったりと、 なかなか良さそうなものがありませんでした。

Autohotkey Ver.2 で、標準で色が使えるGUI要素

そんななか、標準で色を付けることができるものとして「タブ」機能があるのに気が付いたので、 Tab3 (AddTab3)を使って書いてできたのが、上記のメニューの画面です。

ahkスクリプト

 MyGui.AddTab3("X16 +BackgroundYellow",["System"])

がTab3で、色とタイトルを付けています。

本来のTab3の機能である「Tabのページが複数」という使い方をしているのではなく、 単なる1ページだけのTab3を、たくさん上下に並べているというのが、ミソです。

タブの名前が、それぞれのカテゴリの名前のようになって、わかりやすい感じになっているかと思います。

以下 全ahkスクリプト(GUI_menu.ahk)

GUI_menu()
{
    If WinExist("AHK Menu")
    {
        WinActivate
        return
    }
    
    MyGui := Gui("Resize","AHK Menu")
    MyGui.OnEvent("Escape", CloseWindow) ; [ESC] キーで閉じる
    MyGui.OnEvent("Close", CloseWindow) ; X で閉じる
    ;MyGui.BackColor := "00EE99"  ; RGB color
    ;MyGui.BackColor := 0x202020  ; 2024-09-24 ColorButton.ahk
    ;MyGui.BackColor := "Green"
    ;MyGui.BackColor := "Black"
    MyGui.BackColor := "White"
    MyGui.SetFont("s12")  ; フォントサイズ(ポイント)を設定
    
    MyGui.AddTab3("X16 +BackgroundYellow",["System"])
    MyGui.Add("Button", " X32 y+0", "Win+Tab").OnEvent("Click", Win_Tab) ;
    MyGui.Add("Button", " X+20", "1").OnEvent("Click", Win_1) ; 
    MyGui.Add("Button", " X+8 ", "2").OnEvent("Click", Win_2) ; 
    MyGui.Add("Button", " X+8 ", "3").OnEvent("Click", Win_3) ; 
    MyGui.Add("Button", " X+8 ", "4").OnEvent("Click", Win_4) ; 
    MyGui.Add("Button", " X+16 cRed", "Task Mgr").OnEvent("Click", TaskManager_click) ; 
    MyGui.Add("Button", " x+16 cRed", "Shutdown").OnEvent("Click", Shutdown_click) ; 

    MyGui.AddTab3("X16 +BackgroundFF8800",["autohotkey"])
    MyGui.Add("Button", " X32 y+1", "Edit ahk").OnEvent("Click", Edit_ahk_click) ; 
    MyGui.Add("Button", " x+8", "Edit GUI").OnEvent("Click", Edit_ahk_gui_click) ; 
    MyGui.Add("Button", " x+8", "Reload").OnEvent("Click", Reload_ahk_click) ; 

    MyGui.AddTab3("X16 +BackgroundRed",["kobo"])
    MyGui.Add("Button", " X32 y+1", "起動").OnEvent("Click", Kobo_Click) ;
    MyGui.Add("Button", " X+20", "FullScreen").OnEvent("Click", Kobo_FullScreen) ; 
    MyGui.Add("Button", " X+20", "index").OnEvent("Click", Kobo_Index) ; 
    MyGui.Add("Button", " X+20", "Esc").OnEvent("Click", Escape) ;

    MyGui.AddTab3("X16 +BackgroundFF00FF",["Launcher"])
    btn := MyGui.Add("Button", "X32 Y+0 default", "Obsidian") ;
    btn.OnEvent("Click",Obsidian_click) ;
    MyGui.Add("Button", " x+20", "Google").OnEvent("Click", Chrome_click) ; 
    MyGui.Add("Button", " x+20", "Gmail").OnEvent("Click", Gmail_click) ; 
    MyGui.Add("Button", " x+20", "Calendar").OnEvent("Click", Gcalendar_click) ; 
    
    MyGui.AddTab3("X16 +Background00FF00",["Explorer"])
    MyGui.Add("Button", " X32 y+1", "Home").OnEvent("Click", Exp_home) ;
    MyGui.Add("Button", " X+8", "Download").OnEvent("Click", Exp_download) ; 
    MyGui.Add("Button", " X+8 ", "MyDoc").OnEvent("Click", Exp_MyDoc) ; 
    MyGui.Add("Button", " X+8 ", "Desktop").OnEvent("Click", Exp_Desktop) ; 

    ;--------
    MyGui.AddTab3("X16 +BackgroundBlue",["音声、視覚"])
    MyGui.Add("Button", " X32  y+0 cRed", "音声入力").OnEvent("Click", Mic_click) ; 
    MyGui.Add("Button", " X+16 ", "拡大鏡").OnEvent("Click", Loope) ; 

    MyGui.AddTab3("X16 +Background00FFFF",["Capture"])
    MyGui.Add("Button", " x32 y+0", "Win+Shift+s").OnEvent("Click", Capture_click) ; 
    MyGui.Add("Button", " x+8", "Win+PrtScn(全画面)").OnEvent("Click", FullCapture_click) ; 
    MyGui.Add("Button", " x+16 ", "Chrome URL get").OnEvent("Click",Chrome_get_click) ; 

    MyGui.AddTab3("X16  cWhite +Background080808",["Cursor"])
    MyGui.Add("Button", " X32 y+0", "←").OnEvent("Click", Arrow_Left) ; 
    MyGui.Add("Button", " X+8 ", "↓").OnEvent("Click", Arrow_Down) ; 
    MyGui.Add("Button", " X+8 ", "↑").OnEvent("Click", Arrow_Up) ; 
    MyGui.Add("Button", " X+8 ", "→").OnEvent("Click", Arrow_Right) ; 
    MyGui.Add("Button", " X+20 ", "^{Home}").OnEvent("Click", Goto_Head) ; 
    MyGui.Add("Button", " X+8 ", "^{End}").OnEvent("Click", Goto_Tail) ; 
    ;MyGui.Add("Button", " X+8 ", "BS").OnEvent("Click", Back_space) ;

    MyGui.Add("Button", "X32 Y+20", "^入力").OnEvent("Click", Hat) ; 
    MyGui.Add("Button", "X+8 ", "全角空白 入力").OnEvent("Click", Zenkaku_space) ; 
    MyGui.Add("Button", "X+8 ", "SPC").OnEvent("Click", Hankaku_space) ; 
    MyGui.Add("Button", "X+8 ", "Tab").OnEvent("Click", Tab_space) ; 
    MyGui.Add("Button", "X+8 ", "Enter").OnEvent("Click", Enter) ; 
    ;MyGui.Add("Button", "X+8", "Date").OnEvent("Click", Date_click) ; 
    ;MyGui.Add("Button", "X+8", "Time").OnEvent("Click", Time_click) ; 
    ;MyGui.Add("Button", "X+8 ", "-").OnEvent("Click", Add_item_click) ; 
    ;MyGui.Add("Button", "X+8 ", "- [ ] ").OnEvent("Click", Add_checkitem_click) 

    Aaa := WinActive("A")
    if(Aaa != 0){
        Title := WinGetTitle("A")   ;アクティブ タイトル名を取得し Title へ格納
    } else {
        Title := "no active"
    }
    ;MyGui.Add("Text", " x16 y+20", Title)
    MyGui.Add("Text", " x16 y+20 cWhite", Title)    ; 2024-09-24 BackGroudをBlackに変更したため、文字の色をWhiteに

    ;SetTimer(UpdateMenu, 5000) ;5秒後にメニューを閉じる
    ;MyGui.Show("x100 y20")
    MyGui.Show("x1500 y20")

;--------------------
    UpdateMenu(*)
    {
        CloseWindow()
    }
;---MyGui を閉じる関数-----
    CloseWindow(*)
    {
        ;SetTimer(UpdateMenu, 0)
        ;Sleep(100)
        MyGui.Destroy()
    }
;--------------------
    Date_click(*)
    {
        MyGui.Destroy()
        ;IME_set(0)
        now := FormatTime(, "yyyy-MM-dd")
        Sleep(100)
        Send(now)
        Send(A_Space)
    }

    Time_click(*)
    {
        MyGui.Destroy()
        ;IME_set(0)
        now := FormatTime(, "HH:mm")
        Sleep(100)
        Send(now)
        Send(A_Space)
    }

    Edit_ahk_click(*)
    {
        MyGui.Destroy()
        Run("notepad++.exe `"" A_ScriptDir "\AutoHotkey_V2.ahk`"") ;このスクリプトを編集 
    }

    Edit_ahk_gui_click(*)
    {
        MyGui.Destroy()
        Run("notepad++.exe `"" A_ScriptDir "\GUI.ahk`"") ;このスクリプトを編集 
    }

    Reload_ahk_click(*)
    {
        msg := "`"Reload Autohotkey `"" 
        ToolTip(msg)
        Sleep(500)
        ToolTip()
        Reload()    ;このスクリプトをリロードして適用
        return
    }
    
    Chrome_click(*)
    {
        MyGui.Destroy()
        func_chrome_open()
    }

    Chrome_get_click(*)
    {
        MyGui.Destroy()
        func_chrome_capture()
    }

    Capture_click(*)
    {
        MyGui.Destroy()
        Send "#+s"  ; Win+Shift+s
    }

    FullCapture_click(*)
    {
        MyGui.Destroy()
        Sleep(1000)
        Send("#{PrintScreen}")
        Sleep(1000)
        Run("C:\Users\xxxxxxxx\Pictures\Screenshots")
        return
    }
    
    Gmail_click(*)
    {
        MyGui.Destroy()
        browser := "C:\Program Files\Google\Chrome\Application\chrome.exe --disk-cache-dir=R:\Temp"
        Run(browser " `"https://mail.google.com/mail/u/0/#inbox`"")
    }
    
    Gcalendar_click(*)
    {
        MyGui.Destroy()
        browser := "C:\Program Files\Google\Chrome\Application\chrome.exe --disk-cache-dir=R:\Temp"
        Run(browser " `"https://calendar.google.com/calendar/u/0/r?pli=1`"")
    }
    
    Exp_home(*)
    {
        Run("C:\Users\xxxxxxxx\")
    }
    Exp_Download(*)
    {
        Run("C:\Users\xxxxxxxx\Downloads")
    }
    Exp_MyDoc(*)
    {
        Run("C:\Users\xxxxxxxx\Documents")
    }
    Exp_Desktop(*)
    {
        Run("C:\Users\xxxxxxxx\Desktop")
    }
    
    
    Obsidian_Click(*)
    {
        MyGui.Destroy()
        func_obsidian()
    }

    Add_item_click(*)
    {
        MyGui.Destroy()
        Sleep(50)
        Send "- "           ; 行末へ移動
    }
    Add_checkitem_click(*)
    {
        MyGui.Destroy()
        Sleep(50)
        Send "- [ ] "           ; 行末へ移動
    }

;---画面リストアする(またメニューを表示する)-----
    Arrow_Left(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(50)       ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send "{Left}"   ; ←移動
        Sleep(50)       ; ちょっと待つ
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.Restore() ; Guiメニューを表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    Arrow_Right(*)
    {   
        MyGui.Hide()
        Sleep(50)
        Send "{Right}"          ; →移動
        Sleep(50)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.Restore() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    Arrow_Down(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send "{Down}"           ; ↓移動
        Sleep(50)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.Restore() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    Arrow_Up(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send "{Up}"         ; ↑移動
        Sleep(50)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.Restore() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    Goto_Head(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send "^{Home}"  ; 先頭へ移動
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    Goto_Tail(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send "^{End}"           ; 末尾へ移動
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    
    Hankaku_space(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send " "
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }

    Zenkaku_space(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send " "
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }
    
    Hat(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send "{^}"
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }

    Enter(*)
    {
        MyGui.Hide()
        Sleep(30)
        Send("{Enter}")
        Sleep(30)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }

    Tab_space(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send("{Tab}")
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }

    Back_space(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send("{BS}")
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }

    Escape(*)
    {
        MyGui.Hide()
        Sleep(50)
        Send("{Esc}")
        Sleep(100)
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        ;MyGui.show() ; Gui を表示する
        ;SetTimer(UpdateMenu, 5000)
    }

    ;-------------
    Kobo_Click(*)
    {
        MyGui.Destroy()
        Run("C:\Program Files (x86)\Kobo\Kobo.exe") ;
    }
    Kobo_FullScreen(*)
    {
        MyGui.Hide()
        Sleep(50)
        if WinActive("ahk_exe kobo.exe")
        { 
            Send("#{Up}")
            Sleep(500)
            ;MsgBox "kobo.exe"  ;
            Click 2851, 60  ; Surface Pro8
            Sleep(300)
            Click 1350. 1   ; これでフォーカスを ページ送りにする(拡大じゃなくて)
        }
    }
    Kobo_Index(*)
    {
        MyGui.Hide()
        Sleep(50)
        if WinActive("ahk_exe kobo.exe")
        { 
            ;MsgBox "kobo.exe"  ;
            Click 10,10 
        }
    }

;---画面リストアする(またメニューを表示する)-----
; もっといい方法(フリーソフト(VirtualDesktop, WindowsVirtualDesktopHelperなど))もあるので、各自改良どうぞ
; WindowsVirtualDesktopHelperを常駐させ、タスクバーの< 1 >の<>場所を押すあたりがahkっぽいかと
;4画面使っているので、その間での移動
    Win_1(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(100)      ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#^{Left}#^{Left}#^{Left}")    
    }
    Win_2(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(100)      ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#^{Left}#^{Left}#^{Left}")
        Sleep(100)      ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#^{Right}")
    }
    Win_3(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(50)       ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#^{Right}#^{Right}#^{Right}#^{Left}")
    }
    Win_4(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(50)       ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#^{Right}#^{Right}#^{Right}")
    }
    
    Win_Tab(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(50)       ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#{Tab}")
;       Sleep(50)       ; ちょっと待つ
;       Title := WinGetTitle("A")   ;アクティブ タイトル名を取得し Title へ格納
;       MyGui.Restore() ; Guiメニューを表示する
;       SetTimer(UpdateMenu, 5000)
    }

    Mic_click(*)
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        Sleep(100)      ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#h")
        Sleep(50)       ; ちょっと待つ
        Title := WinGetTitle("A")   ;アクティブ タイトル名を取得し Title へ格納
        ;MyGui.Restore() ; Guiメニューを表示する
        MyGui.Show("NA") ; GuiメニューをNotActiveに
        ;SetTimer(UpdateMenu, 5000)
    }
    
    ; 拡大鏡
    Loope(*)    
    {
        MyGui.Hide()    ; メニュー消す (アクティブがエディタ画面に)
        msg := "1秒以内に拡大したいところをクリックしてください"
        ToolTip(msg)
        Sleep(1000)
        ToolTip()
        Sleep(1000)     ; ちょっと待つ(速すぎるとアクティブが切り替わらない)
        Send("#;")
        Sleep(50)       ; ちょっと待つ
        ;Title := WinGetTitle("A")  ;アクティブ タイトル名を取得し Title へ格納
        ;MyGui.Restore() ; Guiメニューを表示する
        ;MyGui.Show("NA") ; Guiメニューを表示する
        ;SetTimer(UpdateMenu, 5000)
    }
 
    TaskManager_Click(*)
    {
        MyGui.Destroy()
        Run("C:\ProgramData\Microsoft\Windows\Start Menu\Programs\System Tools\Task Manager.lnk")
    }
    
    Shutdown_click(*)
    {
        MyGui.Destroy()
        func_shutdown()
    }

}

func_shutdown()
{
    MyGui := Gui(,"Shutdown")
    MyGui.BackColor := "FF0000"  ; 赤
    MyGui.SetFont("s32")  ; 大きなフォント
    MyGui.Add("Text",, "Shutdown")
    MyGui.Add("Button", " default", "OK").OnEvent("Click", OK_click) ; ;
    MyGui.OnEvent("Escape", CloseWindow) ; [ESC]でダイアログを閉じる
    MyGui.show() ; Gui を表示する

    OK_Click(*)
    {
        Run("C:\Windows\system32\shutdown.exe /s /f /t 0")
        return
    }
    CloseWindow(*)
    {
        MyGui.Destroy()
    }
}

1つ1つのボタンに色を付けたいわけではなく、 たくさん増えたボタンが、それぞれどんな役割かが一目わかればいいので、 ちょうどいい感じになっています。

色は、以下で適当に付けていますので、もっと上手にやってみてください。

色の指定 - AutoHotkey Wiki

あと、HWRシリーズも、更新しています。 torazaemon2016.hatenablog.jp

音声認識もできるので、どんどん文章ができていきます。 キーボードなしでも、タブレットWindows PCで文章を作ることが捗るようになりました。

最大の問題だった、漢字を忘れていて書けないので、手書き入力は効率が悪い、は、 最近のWindowsUpdateによる、かな漢字変換可能なTextBoxによって解決しました!

torazaemon2016.hatenablog.jp

AutohotkeyやTouch Panel Gesturesで、キーボードがなくても快適です。

torazaemon2016.hatenablog.jp

音声&手書き文字認識メモ (Ver.2) 手書きでひらがなを書いてかな漢字変換・再変換も可能

漢字が書けなくても、ひらがなで書いて変換。音声認識が誤変換しても、あとから再変換。

しゃべったことがどんどん文字になっていく音声認識メモに、 手書き文字認識機能も追加しました。

apps.microsoft.com

torazaemon2016.hatenablog.jp

認識された文字を「TextBox」にハイライトで表示していますが、 このことで、MS IME をONにして、SPACEキーで変換すると、かな漢字変換が可能になっています。

ひらがなを書いて、ひらがなを文字認識
ハイライト状態でSPACEキーを押してかな漢字変換

また、音声認識した結果の文字列も、誤変換により漢字が違っていた場合でも、 漢字を含んだハイライト状態でSPACEキーを押すことで「再変換」されます。

下図は、マイクに「ここではきものをぬいでください」としゃべって、中段での緑の表示が「音声認識」された結果で、上段にも確定前として表示されていたところでSPACEキーを押して「再変換」している様子です。誤変換されても、再度しゃべり直すことは不要になりそうで、感動しています。

音声認識の結果のハイライト表示
誤変換も再変換で修正可能

これまでのHWRPadなどと違い、上部のTextBoxのほうに確定結果をハイライト表示で出すようにしたら、 思わぬ効果を得ることになりました。

最近のWindowsでの常識っぽいですが(Wordなんかでも同様にできるっぽい)、そもそも自分でキーボードからIMEで変換しているときには、正しくなるように変換して入力してしまうでしょうから、再変換の必要性があまり感じなかったですが、 こんな音声認識による誤変換とか、漢字が書けないからひらがなを書いて変換というのができるとなると、WindowsのTextBoxすげぇとなっています。

HWRシリーズのアプリで、手書きでどんどん書いていこうと思っていたけど、漢字を忘れていて書けない。 そのため、辞書ひいたり、キーボードでググったりと本末転倒になりかかっていましたが、 このアプリでもう安心してペンで手書きでコンピュータに文字を入れていくことができるようになります。

漢字を忘れていても、このアプリを使うことで思い出しながら、また再度自分で漢字を書いてみてとか、ボケ防止にも活用できそうです。

2024-11-13 Ver2.3.1 で、左下にIME ONボタンを追加しました。タスクバーのは状態把握がちょっとやりにくいかったり、押しにくかったりするので、大きなボタンと色を付けて左下に設置しました。押せば緑あと赤AでON/OFFがわかりやすいかと思います。

ひらがなを書いた後でもボタンを押すことでONにしてかな漢字変換できますし、Surface stylusのように、頭に消しゴムが付いているペンで消せば、かな漢字変換中でも文字の削除や追加ができるので、大変便利です。

IME ONボタンの追加

また、物理キーボードがない場合でも、Windows11のスクリーンキーボードを使って、スペースキーで変換できます。 ただし、キーボードレイアウトは、クラシック形式の表示のものでないと、ダメでした。コンパクトなどでは、変換になりませんでした。

スクリーンキーボードならクラシック形式ならスペースキーで変換できる

これで、本当に物理キーボードがなくても、日本語の文章をペン1本で入力していける環境ができました。

他にもあろうVirtual Keyboardアプリでも行けるかもしれませんし、スペースキーとEnterキー程度のキー送出プログラムを自作して、一緒に使うのも有りかと思います。 Storeアプリ「LRButton」を改造すればというか、もともとは仮想キーボードの作成だったので、作ってみているのですが、需要ってありますかねぇ?

torazaemon2016.hatenablog.jp

TouchPanelGesturesを使って快適に楽天KOBOで本を読む

タブレットPC (キーボードがないPC(Surface Pro/Go))を快適に操作する環境を作る(その2)です。

KOBOで漫画を見るとき、画面の左右のどこかを押せばページ送りされるのですが、その動作はワンテンポ遅く、 書籍はさらに、左右端の中央にある丸い小さな矢印ボタンでしかページがめくれないGUIのようです。

キーボードがあれば、左右の矢印キーでページ送りできるので、それほど問題はありませんが、 キーボードなしのタブレットPCという環境では、ストレスしかありません。

そこでTouchPanelGesturesによって、楽天KOBO電子書籍や漫画を読むときのストレスを軽減させます。

KOBOでの設定の様子

具体的な操作の設定は、以下の4つです。

  • 左右のスワイプでページ送り (指1本でも、指2本でも同じ動き) (カーソルキーの左右キーの機能)
  • 指2本上スワイプで、全画面表示 (F11にバインドして、Autohotkeyの設定で全画面に)
  • 指2本下スワイプで、全画面表示から戻る (Escキー)
  • 指3本上スワイプで、拡大鏡 (Win + ; )

これだけでもKOBOでの読書体験はかなり向上します。

左右スワイプは、よくやる操作方法だし、 KOBOの画面において、全画面のボタンのところが小さくて押すのが難しく、2,3度押して全画面にしていたのが一発です。 また通常画面に戻るのも簡単になりますので、

大鏡は、Windows11の機能ですが、SurfaceProで楽天KOBOを動かすと、画面解像度が高い分、一覧表示での字が小さく見えにくく、本が選びにくいため、多用するようになりました。(老眼…)

上の図を見て、「ジェスチャーとキー設定」を行ってもらえればいいのですが、設定ファイルの中も以下に。

TouchPanelGestures設定(setting.ini ファイル)のKOBOに該当する部分です。(TouchPanelGesturesのフォルダ内にあるかと思います)

Gesture61=Kobo.exe
Gesture62=--→/37
Gesture63=--←/39
Gesture64=--②→/37
Gesture65=--②←/39
Gesture66=--②↓/27
Gesture67=--②↑/122/Full Screen
Gesture68=--③↑/2235/拡大鏡

122は「F11」に該当するもので、 「F11」はKindleでの全画面表示がファンクションの「F11」に割り当てられているので、 KOBOでも同様に「F11」としたものです。

以下はAutohotkeyでの該当部分です。Autohotkeyの設定ファイル(autohotkey.ahkなど)に追加してください。

$F11::
{
    if WinActive("ahk_exe kobo.exe")
    { 
        ; Surface Pro 8
        Click 2851, 60  ; 拡大GUIの場所をAutoHoeKey Windows Spyで見つけた座標
        Sleep(300)
        Click 1350. 1   ; これでフォーカスを ページ送りにする(拡大じゃなくて)
        ;; Surface Go3 なら以下の数値
        ; Click 1895, 65
        ; Sleep(300)
        ; Click 950, 1
    }
    else if WinActive("ahk_exe Kindle.exe")
    { 
        Send("{F11}")   ; ループしないように、定義を $F11 として1回だけに
    }
}

Clickを2回やっているのは、1回だけだと全画面になったのちに左右矢印キーが「画面の拡大」と解釈されてしまうため、 本の上部をクリックし、矢印キーが拡大ではなくページ送り操作の指示になるようにするためです。

適宜修正してご利用ください。

なお、左右のスワイプでのページ送りの際に、画面の真ん中にTouchPanelGesturesが表示する 認識ジェスチャーとそのコメントが「毎回」出るので、ちょっと読書体験が下がります。

また、ページを連続でめくろうとすると、そのたびにスワイプが必要など、ページ送りに対してストレスがまだあるので、 これを解決するため、ページ送り専用の「LRButton」というアプリを作成し、ストアに出していますので、 また、ご利用いただけたら幸いです。

torazaemon2016.hatenablog.jp

前回の「TouchPanelGesturesを使ってキーボードがなくてもPCを操作する環境を作る」 torazaemon2016.hatenablog.jp