[BlueLeaf1336]> DOWNLOAD> UnUtility>

マウスユーティリティ類似粗悪品 PicoPicoMouse

historyTOP

2006/08/19:作成

動機TOP

インターネットで正しい時刻を配信しているサーバーにアクセスしてパソコンの時間をあわせるNTPクライアントについて調べていたときに、何とかいうサーバーに対応しているクライアントが紹介されていました。

ひとつは、普段使わせていただいているブラウザDonutの兄弟ブラウザDonutPで、もうひとつが何とかいうプログラムでした。そちらのリンク先を見てみると、かの有名なチューチューマウスの作者のサイトで、たしか「ここからマウスユーティリティの歴史は始まった」とかいう非常にかっこよい説明がありました。Windows3.1に対応しているようなプログラムをダウンロードできるぐらいなので、実際にそうなんだろうと思いました。

読書感想文をあらすじやあとがきで埋め尽くす小学生のような感想になってしまった上に、オフラインで書いているので、正式な名前やリンクをはれないのですが、ここでは、タイトルのとおり「チューチューマウスの類似粗悪品」を作成します。 (実際にはこれを書いている時点で、すでに作成は終わっていますが)

方針TOP

実は、チューチューマウスを使ったことがないのですが、確かダイアログが表示されたときにマウスをその位置まで動かしてくれるユーティリティだったんじゃないかと。

ここでは、このプログラムの時にはやらないとかどうとかは、すべて棚上げして、「ダイアログが表示されたときにそのダイアログのボタンの位置にマウスを持っていく」ことだけを目標にします。

ダウンロードと説明TOP

PicoPicoMouse20060819.zip(222,076Bytes) ソースコードと実行ファイルです。

使い方

  1. 起動すると、タスクトレイに入ります。
  2. 終了方法は、タスクトレイのアイコンを右クリックして「Exit」です。
  3. メモ帳を立ち上げて、変更を加え、保存せずに×ボタンなどを押します。
  4. 「保存しますか」ダイアログを検知してマウスが「はい」のボタンに移動します。(多分)
  5. デバッグ目的で移動先のボタンを縁取るように黒っぽい枠を描画します。

ソースコードについてTOP

ダウンロードファイルを解凍すると、「dllsrc」と「src」の二つのフォルダが入っています。

「dllsrc」はCBTフックをかけるための「hook.dll」のソースコードです。

「src」はCBTフックをdllから通知してもらってごにょごにょする本体のソースコードです。

TDialogMonitor の処理はこんな感じです。これ以外の処理は、タスクトレイになるためやCBTフックを行ったり通知したりするためのもので、どうでもよいものばかりです。

このメソッドは、Windowsが作るあらゆるウィンドウが作成されたタイミングで呼び出されます。多分。ココでは、ダイアログであるかどうかをクラス名だけで判断しています。そしてそれ以外のウィンドウの場合は何もしていません。また、作られたダイアログの中身がどんなものであっても、適当にボタンを探してそこにマウスを移動させているだけです。

変な場所にマウスが行ったりすることもあります。が、実害はないような感じです。

//------------------------------------------------------------------------------
//  ウィンドウが作られた
procedure TDialogMonitor.DoTargetCreate(WH: HWND);
var
    LClassName: String;
    LHandle: HWND;
    LInfo: TWindowInfo;
    LRect: TRect;
    LPoint: TPoint;
begin
    //  クラス名を取得
    LClassName := GetClassNameStr(WH);

    //  ダイアログクラスの場合
    if (LClassName = '#32770') then
    begin
        //  残りの部品が作成されてしまうのを待つ
        Sleep(100);

        //  ボタンのハンドルを取得する(多分一番左端のボタン)
        LHandle := FindChildOfClass(WH, 'button');

        //  見つかれば
        if (LHandle <> 0) then
        begin
            //  スクリーン上の位置を取得
            FillChar(LInfo, SizeOf(LInfo), 0);
            LInfo.cbSize := SizeOf(LInfo);
            GetWindowInfo(LHandle, LInfo);
            LRect := LInfo.rcClient;

            //  ボタンの中心にマウスを移動
            LPoint := Types.CenterPoint(LRect);
            SetCursorPos(LPoint.X, LPoint.Y);

            //  強調表示(テストの目的)
            FlashDesktopCanvas(LHandle, 100);
        end;
    end

    //  Delphiの CreateMessageDialog で作成されたダイアログの場合
    else if (LClassName = 'TMessageForm') then
    begin
        //  残りの部品が作成されてしまうのを待つ
        Sleep(100);

        //  ボタンのハンドルを取得する(多分一番右端のボタン)
        LHandle := FindChildOfClass(WH, 'TButton');

        //  見つかれば
        if (LHandle <> 0) then
        begin
            //  スクリーン上の位置を取得
            FillChar(LInfo, SizeOf(LInfo), 0);
            LInfo.cbSize := SizeOf(LInfo);
            GetWindowInfo(LHandle, LInfo);
            LRect := LInfo.rcClient;

            //  ボタンの中心にマウスを移動
            LPoint := Types.CenterPoint(LRect);
            SetCursorPos(LPoint.X, LPoint.Y);

            //  強調表示(テストの目的)
            FlashDesktopCanvas(LHandle, 100);
        end;
    end

    //  それ以外の場合は何もしない
    else
    begin
        Exit;
    end;

    //  継承元のクラスの処理呼び出し
    inherited DoTargetCreate(WH);
end;

最後にもう一度。このページからダウンロードできるプログラムは、類似品です。しかも粗悪品です。

EOFTOP