[BlueLeaf1336]> DOWNLOAD> UnUtility>
history | TOP |
2006/08/19:作成
動機 | TOP |
インターネットで正しい時刻を配信しているサーバーにアクセスしてパソコンの時間をあわせるNTPクライアントについて調べていたときに、何とかいうサーバーに対応しているクライアントが紹介されていました。
ひとつは、普段使わせていただいているブラウザDonutの兄弟ブラウザDonutPで、もうひとつが何とかいうプログラムでした。そちらのリンク先を見てみると、かの有名なチューチューマウスの作者のサイトで、たしか「ここからマウスユーティリティの歴史は始まった」とかいう非常にかっこよい説明がありました。Windows3.1に対応しているようなプログラムをダウンロードできるぐらいなので、実際にそうなんだろうと思いました。
読書感想文をあらすじやあとがきで埋め尽くす小学生のような感想になってしまった上に、オフラインで書いているので、正式な名前やリンクをはれないのですが、ここでは、タイトルのとおり「チューチューマウスの類似粗悪品」を作成します。 (実際にはこれを書いている時点で、すでに作成は終わっていますが)
方針 | TOP |
実は、チューチューマウスを使ったことがないのですが、確かダイアログが表示されたときにマウスをその位置まで動かしてくれるユーティリティだったんじゃないかと。
ここでは、このプログラムの時にはやらないとかどうとかは、すべて棚上げして、「ダイアログが表示されたときにそのダイアログのボタンの位置にマウスを持っていく」ことだけを目標にします。
ダウンロードと説明 | TOP |
PicoPicoMouse20060819.zip(222,076Bytes) ソースコードと実行ファイルです。
使い方
ソースコードについて | 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;
最後にもう一度。このページからダウンロードできるプログラムは、類似品です。しかも粗悪品です。
EOF | TOP |