VirtualDesktopでの挙動について

  1. いつもMeryを使わせて頂いてます。
     WIndows10から導入されたVirtualDesktopにてデスクトップ1で既にMeryを起動している状態でデスクトップ2に移動後にMeryを起動した時にデスクトップ1のウィンドウに新しいタブが作成され、デスクトップ1に移動しています。以下の情報によるとVirtualDesktop関連のVisual C#向けのAPIは、あるようですが多言語に向けてはまだ公開されていないようです。
     もし、DelphiからこのAPIへのアクセスが可能になったら実装のお手伝いをしたいと考えています。

    https://blogs.msdn.microsoft.com/winsdk/2015/09/10/virtual-desktop-switching-in-windows-10/

     |  HYTK  |  返信
  2. ご愛用ありがとうございます。
    VirtualDesktop というものがあるのは知っていましたが、一度も使ったことがありませんでした^^;

    こちらでも試してみましたところ、おっしゃる通りの挙動でした。(まぁ、確かにそうなるわな。と言った感じではありますが…w)

    Mery が起動している状態でデスクトップなどのアイコンをダブルクリックして起動したときに、現状では既存ウィンドウに新規タブを作成していますが、新しいウィンドウで開くようにすればとりあえず回避はできそうな気がしますね。

    でも、そうしてしまうとアイコンダブルクリックで新規タブを作成という動作が気に入ってるユーザさんたちに影響が出そうなので、オプションでどっちか選ばせるとかそんな感じにするしかなさそうですね。

    VirtualDesktop の API が使用できれば、Mery のウィンドウがないデスクトップ 2 の場合は新規ウィンドウ、みたいなことができるようになるのでしょうかね~。

     |  Kuro  |  返信
  3. こんばんは。
    C# のサンプルコードをちょっとだけ Delphi に翻訳してみましたところ、なんとなく動くようになりました。

    IsWindowOnCurrentVirtualDesktop メソッドでカレントデスクトップに Mery のウィンドウが一つでもあるかどうかをチェックして、一つでもあればそのウィンドウに対して新規タブ、一つもない場合は新規ウィンドウ、といった感じのプログラムが組めればなんとかなりそうです。

    でも、問題がありまして、なぜかアイコンをダブルクリックした直後は IsWindowOnCurrentVirtualDesktop が失敗するという…。アイコンをダブルクリックしてからワンテンポ遅らせると大丈夫っていう、ヤな感じの挙動を見せております。

    ご協力いただけるとのことですが、もしや Delphi 使いの方でいらっしゃいますか!?もしそうでしたら、ぜひアドバイスをいただきたいものでございます!

     |  Kuro  |  返信
  4. 少し進捗をご報告します。

    IVirtualDesktopManager は Delphi から使えるようになったのですが、現在のところ公式で発表されている API は下記の 3 つのみ。

    IsWindowOnCurrentVirtualDesktop (指定したウィンドウが現在のデスクトップにあるか)
    GetWindowDesktopId (指定したウィンドウがあるデスクトップの GUID を取得)
    MoveWindowToDesktop (指定したウィンドウを指定した GUID のデスクトップに移動)

    しかしながら、用意されている API はウィンドウが存在するデスクトップの GUID を取得するもののみで、ウィンドウが一つもない状態で「現在のデスクトップ GUID」を取得するすべがありません。

    つまり、デスクトップ 1 で「a.txt」を開いて、デスクトップ 2 を表示している状態で「a.txt」を開いたときに、理想的なのはデスクトップ 1 の「a.txt」のウィンドウを MoveWindowToDesktop でデスクトップ 2 に持って行きたいのですが、デスクトップ 2 にはウィンドウが一つもないので GUID を取得することができないため不可能ということになります。

    (一時的にダミーのウィンドウをデスクトップ 2 に作成して、そのウィンドウに対して GetWindowDesktopId を使ってデスクトップ 2 の GUID を得るという荒技はありますが…^^;)

    実は、IVirtualDesktopManagerInternal というロシア人が発見した?隠し機能が存在しており、これを使えばウィンドウが一つもない状態でも現在のデスクトップ GUID を取得できるのですが、MS 公式ではないため、Windows のビルドによってインターフェイスの ID が異なるようなので、実装するのがちょっと危険という感じです。

    MS 公式で IVirtualDesktopManagerInternal  が発表されれば良いのですが…

    というわけで現状の API (IsWindowOnCurrentVirtualDesktop ) だけで対応できるのは、デスクトップ 1 で Mery を起動した状態で、デスクトップ 2 に移動して Mery を起動した場合にデスクトップ 2 に新規ウィンドウを開くぐらいまでかなと思います。

    お気づきの点などございましたら助言いただけると助かります。

     |  Kuro  |  返信
  5. 返信が遅れすみません。

    調査して頂きありがとうございました。僭越ながらコメントさせて頂きます。

    以下の点については、仕方ないと感じます。Meryには、ファイルの更新を検知して再度ロードする機能があるので、別のデスクトップで意図せず「a.txt」をユーザーがファイルを更新してしまっても、別のウィンドウに移った時点で「a.txt」が更新した旨を知らせるダイアログが表示されるのでは、実用上あまり問題にならないと私は、感じます。

    > つまり、デスクトップ 1 で「a.txt」を開いて、デスクトップ 2 を表示している状態で「a.txt」を開いたときに、 
    > 理想的なのはデスクトップ 1 の「a.txt」のウィンドウを MoveWindowToDesktop でデスクトップ 2 に持って行
    > きたい のですが、デスクトップ 2 にはウィンドウが一つもないので GUID を取得することができないため不可能
    > ということ> になります。

    以下の様になることでより一層素晴らしいソフトウェアになると思います。

    > デスクトップ 1 で Mery を起動した状態で、デスクトップ 2 に移動して Mery を起動した場合にデスクトップ 2 
    > に新規ウィンドウを開くぐらいまでかなと思います。

    P.S. 当方は、数年Delphiでの開発経験があります。何かございましたら @HYTK までご連絡いただければ幸いです。

     |  HYTK  |  返信
  6. 書き込みありがとうございます。

    > 以下の様になることでより一層素晴らしいソフトウェアになると思います。

    > > デスクトップ 1 で Mery を起動した状態で、デスクトップ 2 に移動して Mery を起動した場合にデスクトップ 2 
    > > に新規ウィンドウを開くぐらいまでかなと思います。

    上記の仕様ですが、一度は実装したものの VirtualDesktop の API の挙動が怪しいため廃止いたしました。

    Mery 側でできる対応としましてはバージョン 2.5.4 にて、外部から起動時に新規の場合は新しいウィンドウ、既存のファイルを開いた場合は最近使ったウィンドウの新しいタブで開く隠しオプションを追加いたしました。

    詳細は Mery.txt の 2016/09/23 (2.5.4) 更新履歴の部分に記載しています。

     |  Kuro  |  返信
  7. 隠し機能があるのですね。こちらを試してみます。
    ありがとうございました。

     |  HYTK  |  返信
スポンサーリンク