27 3月

Tascher Ver.1.62公開

マウスの移動とホイールの回転やMigemoインクリメンタルサーチでウインドウを切り替えるTascher Ver.1.62を公開しました。

○Ver.1.62 – 2017/03/27
・タスクバーへのアイコン登録に失敗すると操作ができなくなる不具合を修正。
・Migemo検索において特殊記号「[」「]」「~」でもマッチできるように。
・ウインドウリストのフレームを非表示にできない不具合を修正。
・Ver.1.61までの隠し設定を設定ダイアログの「高度な設定」タブから編集できるように。
・[表示方法]-[マウスの移動]に「上」「左」「右」「下」「マウスホイール回転時のみ」を追加。
・「restore」をShowWindow(SW_RESTORE)ではなくPostMessage(WM_SYSCOMMAND,SC_RESTORE)で行うように
・中断しているUWPアプリを列挙しないように。
・UWPアプリのアイコン表示やファイル名取得に対応。(Windows 10に対応)
・ウインドウのサムネイル表示ができるように。
・ウインドウリスト非表示時に関係のないウインドウに切り替わってしまう不具合を今度こそ修正。

ストアアプリ(UWPアプリ)の列挙やアイコン取得に対応しました。
以下、Note.txtの内容掲載。
《UWPアプリ対応メモいろいろ》

  • 中断かつタスクバーに表示されていないUWPアプリ(「設定」、「ストア」、「フォト」等々)を弾くため、
    1. WS_EX_NOREDIRECTIONBITMAPの有無でUWPアプリか確認。
    2. DwmGetWindowAttribute(DWMWA_CLOAKED)でFALSEを返すウインドウのみを列挙。
  • ↑で列挙されるウインドウはクラス名「ApplicationFrameWindow」、プロセス名は「ApplicationFrameHost.exe」とUWPアプリ共通なので、
    FindWindowEx(hWnd,NULL,”Windows.UI.Core.CoreWindow”,NULL)
    で取得したウインドウハンドルを利用し個別のプロセスを操作。
  • UWPアプリが最小化されている場合、「Windows.UI.Core.CoreWindow」は「ApplicationFrameWindow」以下ではなくトップレベルに存在するため、
    1. トップレベルの「Windows.UI.Core.CoreWindow」を列挙。
    2. ↑のウインドウタイトルを含む「ApplicationFrameWindow」を親とする。

    という処理に。
    ただ、これだと一部UWPアプリに対応出来ないと思われます。
    Ver.1.63で改善

  • UWPアプリのアイコンはSendMessage(WM_GETICON)やGetClassLongPtr(GCLP_HICON)で取得することができません。
    アイコン(HICON)取得方法は以下の通り。
    1. ↑で取得した「Windows.UI.Core.CoreWindow」のウインドウハンドルからGetWindowThreadProcessId()でプロセスIDを取得。
    2. OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION)で開く。
    3. GetPackageFullName()でパッケージ名取得。
    4. GetPackagePathByFullName()でUWPアプリのディレクトリを取得。
    5. PackageIdFromFullName()でパッケージIDを取得。
    6. UWPアプリのディレクトリにある「AppxManifest.xml」をMSXMLで開く。
    7. Square44x44Logoからロゴのパスを取得。(Windows 8.1ならSquare30x30Logo、Windows 8ならSmallLogoらしい。未確認。)
      (Microsoft Edgeなら”Assets\MicrosoftEdgeSquare44x44.png”が取得出来ました。)
    8. BackgroundColorから背景色を取得。
    9. “@{パッケージ名?ms-resource://パッケージID/Files/ロゴのパス}”をSHLoadIndirectString()に投げ、ロゴ用PNGファイルをパスを取得。
      Ver.1.64から「”@{パッケージ名?ms-resource:///Files/ロゴのパス}”」で取得するように。
    10. Gdiplus::Bitmap()でロゴを開く。
    11. 表示用アイコンのサイズでGdiplus::Bitmapを作成し、Gdiplus::Graphics()で開き、FillRectangle(BackgroundColor)で塗りつぶす。
    12. 読み込んだロゴをDrawImage()で描画し、GetHICON()でHICONを取得。
  • 上記は全てWindows 10で確認しました。Windows 8/8.1で動作するかは不明です。

サムネイルの表示機能なんかも実装してみました。
Windows10導入と同時にXPが故障したため、XPでは動作を確認していません。

広告