オートホットキーを使用してこれを実現する方法はありますか?いくつかのウィンドウを、開いているプログラムの数に関係なく、常にタスクバーの右上に表示したいです。たとえば、現在は次のようになっています。これしかし、メモ帳は常にタスクバーの右端に置きたいのです。例えば、これしたがって、いくつのプログラムを開いても、タスクバー上でメモ帳が常に右端に表示されるようにしたいのです。
私は Windows 8.1 と最新バージョンの AutoHotkey を使用しています。説明: メモ帳のウィンドウ自体を画面の右端に配置したくありません。 いいえ、その代わりにメモ帳のタスクバーのアイコンだけを右端に配置したいのです。 つまり、たとえば新しいプログラムを開いたときに、アイコンが自動的に右に移動され、メモ帳のアイコンの後にアイコンが表示されないようにします。
インターネットで検索しましたが、役に立つものや似たようなものは見つかりませんでした。そこで、メモ帳のアイコンを常に右側に表示するようにしました。開いたメモ帳がすべて右側に移動されるか、開いているメモ帳だけが右側に表示されるかは関係ありません。4 つのメモ帳を開いて、コンピューターの電源を切るまで保持しておけば、決して閉じることはありません。
どうすれば実現できるでしょうか? AutoHotkey は非常に優れたソフトウェアであり、多くの機能強化が施されているため、必ず方法があるはずです。
よろしくお願いします。このサイトでの最初の質問ですので、敬意を持ってお願いします。ありがとうございます。
答え1
私の知る限り、タスクバー上のアイコンを移動する唯一の方法はドラッグすることなので、これはプログラムで手順を実行する AHK スクリプトです。
^F1::
toggle = true
Window = 0
while (toggle) {
OldWindow = %Window%
WinGet Window, List
if (Window > OldWindow) {
SetTitleMatchMode, RegEx
IfWinExist, Notepad$
{
WinActivate
} Else {
; MsgBox Cannot find Notepad window.
Continue
}
; absolute coordinate
CoordMode Pixel, Screen
CoordMode Mouse, Screen
Sleep, 100 ; wait for the Notepad icon to be fully highlighted, because Windows have animation of lighting icon
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *5 *TransWhite D:\np.bmp
; allow some variation because Windows have anti-aliasing etc.
; ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *10 *Icon1 %A_WinDir%\system32\notepad.exe
; because of some reason the above command does not work
if ErrorLevel = 2
MsgBox Could not conduct the search.
else if ErrorLevel = 1
MsgBox Icon could not be found on the screen.
else {
MouseGetPos OldX, OldY
SetDefaultMouseSpeed, 0
MouseMove, %FoundX%, %FoundY%
Click down left
MouseMove, A_ScreenWidth, %FoundY% ; move the mouse all the way to the right
Click up left
MouseMove, %OldX%, %OldY% ; move mouse to old position
}
}
Sleep, 500 ; can be omitted
}
Return
^F2::
toggle = false
Return
ノート:
- 何らかの理由で使用できない場合や、同様の理由で、メモ帳にフォーカスがあるときにメモ帳トレイ アイコンで構成される
*Icon1 %A_WinDir%\system32\notepad.exe
ファイルを提供する必要があります。D:\np.bmp
- 押す
^F1
とオンになり、 を押す^F2
とオフになります。 - メモ帳タスク アイコンをドラッグするために使用される部分は、報告されたウィンドウの数が
WinGet
増えるたびに、つまり新しいウィンドウを開くたびに実行されます。 - メモ帳ウィンドウは、右にドラッグされるたびにフォーカスされます。
- 無限ループ ( ) を使用する以外に、コマンドを毎回実行する方法はありません
while (toogle)
。CPU を消費する可能性があります。
答え2
この問題に対する組み込みまたは低ハードルのソリューションは知りません。この機能が本当に必要な場合は、プロセスを指定してタスク バー上のウィンドウ ボタンを再配置できる独自のヘルパー アプリを作成する必要があると思います。これは実現可能ですが、Win32 と C++/C# に関する知識が必要です。私は 30 分間 (個人的な制限) 試してみました。
私がやったことは次のとおりです: このスレッドは完璧な出発点です:システムトレイアイコンを持つプロセスを取得する方法 ポイント 6. 古い (32 ビット) バージョンの Windows に有効なソリューションを提供します。タスクバーのウィンドウボタンを整理するツール 残念ながら、64 ビット OS および Windows 10 では動作しません。
それでも、サンプルの調査中に、6 で提供されているいくつかの発見がありました。Windows 10 でタスク バーを見つけるには、次のコードを使用します。
...
//IntPtr hToolbar = User32.FindWindowEx( hTask, IntPtr.Zero, "ToolbarWindow32", null ); xp +
IntPtr taskBarWnd = User32.FindWindowEx(hTask, IntPtr.Zero, "MSTaskListWClass", null);
TBBUTTON 構造体の 64 ビット定義が必要になります。
[StructLayout(LayoutKind.Sequential)]
public struct TBBUTTON
{
public int iBitmap;
public int idCommand;
[StructLayout(LayoutKind.Explicit)]
private struct TBBUTTON_U
{
[FieldOffset(0)]
public byte fsState;
[FieldOffset(1)]
public byte fsStyle;
[FieldOffset(0)]
private IntPtr bReserved;
}
private TBBUTTON_U union;
public byte fsState { get { return union.fsState; } set { union.fsState = value; } }
public byte fsStyle { get { return union.fsStyle; } set { union.fsStyle = value; } }
public UIntPtr dwData;
public IntPtr iString;
}
これは、独自のソリューションを構築するための良い出発点となるはずです。
もう一つの役に立つ出発点は、7+ タスクバー調整ツール、これは非常に便利なタスクバーの調整機能を備えています (名前が示すとおり)。7+TT には、ほとんどの (黒魔術) を実行するライブラリも用意されており、DIY ソリューションの開始点としても使用できます (さらに、Windows 1607 でも動作します。タスクバーの内容を印刷するサンプルをご覧ください。AppId は、適切なタスクバー ボタン ウィンドウ/ボタン グループを見つけるための優れたフックです)。
幸運を。
アップデート
7+TT Lib の助けを借りれば、目標の達成は非常に簡単になります。
ここは作業サンプル作成しました (アーカイブにはサンプルのソースと、x64/Release フォルダー内の taskbar_pusher というバイナリが含まれており、これは Windows 7 - 10 の最新リリース v1709 まで動作するはずです)。
タスクバーの最後尾にプッシュするボタン グループの AppId を、コマンド ライン パラメータとして次のように指定する必要があります。
./taskbar_pusher {1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\notepad.exe
私のツールの CLI 出力から AppId を取得します。AHK
を使用すると、このようにパラメーター化して呼び出すことができるはずです (ただし、私は AHK にあまり詳しくありません)。
PS: セカンダリ タスクバーに問題があったため、それを検出するためのコードを無効にしました。