ALT+Tabチックなプログラムを書く…切替タスク取得編

Windowsでタスク切替を行うショートカットキーと言えば、ALT+Tab系でコノ機能を拡張してくれるフリーのプログラムも結構あります。個人的にお薦めは、Alt-Tab Extender – Joeです ;)

でも、今回欲しかったのはWindowsの画面を飛ばしてWindowsCE側でタスク切替操作するのが前提。さらにフリーウェアも入れさせてくれないなどの理由から、ALT+Tabチックなプログラムを自前で実装してほぼ完成したんですが…画面飛ばしの某商用ソフトの機能で何とかなったので、結局陽の目を見ることはなくなっちゃいました :|

いわゆるチョンプロに近いものなんですが…結構面白かったので要点を少しづつ小分けにしてメモ。なお、開発環境はなんでイマドキって感じですが…VC6+MFCです(客先指定ですから) :arrow: 実行環境はXPと2003 Serverです。

とりあえず、タスク切替ですのでタスクを取得できなければお話になりません。なので、とにかくALT+Tabキーを押した時に表示されるのと同じものを取得してみます。

EnumWindowを使って、ウィンドウを列挙してそこから何とか合わし込めば良いだろうと思ったのですが…Google先生に訊いても書いてるページによって、少しづつ条件が異なってたりします。結局以下のような感じで切り替えるタスクのウィンドウをリストアップしました(少なくともXP、2003 Serverでは良さげです)。

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    HWND parent = ::GetParent(hwnd);
        // 親ウィンドウが居るものはリストアップしない
        // ただし、親がデスクトップのものはリストアップ対象とする
    if (parent != NULL && parent != ::GetDesktopWindow()) {
        return TRUE;
    }
 
    DWORD visible = ::GetWindowLong(hwnd, GWL_STYLE) & WS_VISIBLE;
    DWORD tool = ::GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW;
    HWND owned = ::GetWindow(hwnd, GW_OWNER);
        // VISIBLE属性のものはリストアップ対象
        // TOOLWINDOW属性のものはリストアップ除外
        // OWNERウィンドウはリストアップ除外
    if (visible == 0 || tool != 0 || owned != NULL) {
        return TRUE;
    }
 
    TCHAR strWindowText[BUFSIZ];
        // ウィンドウタイトルの取得に失敗したらリストアップ除外
        // ウィンドウタイトルがないものもリストアップ除外
    if (::GetWindowText(hwnd, strWindowText, BUFSIZ) > 0) {
        // リストアップするウィンドウハンドルなのでhwndを保持する
    }
    return TRUE;
}
 
        // リストアップしたい時にEnumWindowを呼び出す
    EnumWindow(EnumWindowsProc, 0);

とりあえず、上記プログラムの条件でALT+Tabと同じに合わし込むことができました。

ちなみに自分自身はダイアログベースのアプリで、自分自身はリストアップされないようにTOOLWINDOW属性を付けてます。あと、タスクバーにも自身が表示されないようにOnInitDialogメソッドの中に以下のコードも書いてたりします。

    ModifyStyleEx(WS_EX_APPWINDOW, 0)

しかし、何も条件をつけないでウィンドウを列挙すると何もアプリケーションを起動してない時点で約300個近いウィンドウが列挙されるとは…Windows恐るべし。さすが、Windowsと名乗るだけのことはあります :mrgreen:

てか、色んなものを引きずって来てるのでWindowsのウィンドウには色んな属性はあるわ、ウィンドウを扱うAPIも混乱するほどあるし、トドメは拡張とか言ってExもあるし…ホントつくづく厭になりますね。

Be Sociable, Share!

TrackBack URL :

Comments

  1. 11月 16th, 2008 | 12:03 AM

    [...] 『Slashcolon /: » ALT+Tabチックなプログラムを書く…切替タスク取得編』の一応続編です。 [...]

  2. 11月 17th, 2008 | 12:05 AM

    [...] 『Slashcolon /: » ALT+Tabチックなプログラムを書く…切替タスク取得編』と『Slashcolon /: » ALT+Tabチックなプログラムを書く…アイコン取得編』の一応続編です [...]

  3. 11月 18th, 2008 | 12:02 AM

    [...] 『Slashcolon /: » ALT+Tabチックなプログラムを書く…切替タスク取得編』 [...]

Leave a reply