Blog
2001年07月26日(木) ClockLauncher v1.30
FFが一段落したので(クリアはしてないけど)、少し時間を使い「時刻あわせ」機能を付けてみた。こちらのページに、わかりやすいサンプルソースがあったので、参考にさせていただきました。
ページ作者様ありがとうございます。
なんか、環境設定のタイマーページがやけにリソースを消費してる。なぜだろう?
2001年07月21日(土) 「窓の杜」効果
窓の杜に記事載ってからアクセスがすごいことになってます。18日 62
19日 672 (記事になった日)
20日 1016
1000超えたのには、さすがにびびった。
まあ、一時的なものだろうけど嬉しいね。
少しはユーザー増えたかな?
2001年07月05日(木) InsertMenuについて(MFC)
ファイルアイコンがフォルダアイコンに化ける現象が直った気がするので、こっそり v1.11.1 に差し替えておきました。いままでは、メニュー作成する際の InsertMenu のパラメータでコマンドIDと文字列を渡して、描画時にコマンドIDから配列サーチしたりして相当無駄な処理(というか、おかしな処理)してたんです・・・
プログラム的にどう考えてもおかしいとは思ってたんだけど(汗
MSDNで、ちょいと調べてみると、
nFlags lpszNewItem の解釈
MF_OWNERDRAW
アプリケーション提供の 32 ビットの値を保持します。この値は、アプリケーションがそのメニュー項目に割り当てる付加的なデータを管理するために使います。この 32 ビットの値はWM_MEASUREITEM メッセージとWM_DRAWITEM メッセージにより提供される構造体の itemData メンバに格納され、アプリケーションで利用できます。これらのメッセージはメニュー項目が初期表示されたとき、または変更されたときに送られます。
などと、書いてありました。
オーナードロー(MF_OWNERDRAW)の場合、別に文字列じゃなくて構造体のポインタ渡してもよかったんだね(汗
速度的にはミリ秒単位でしか変わってないとは思うけど、プログラム的にはかなりスッキリしました。
というか、いままでしょぼいプログラム書いてた・・。
分かる人にしか分からない内容だけど、まだまだ未熟です。
2001年07月04日(水) ClockLauncher v1.11
毎日のようにバージョンアップしてるんですが、いいんでしょうかねえ?ここも、開発日記になってるし...
さて、今回はランチャメニューの折り返し設定と、サブメニュー展開時にフォルダを開けるようにしてみました。
前者はどうでもいいんですが、後者に関してはサブメニュー展開の使いみちが結構増した気がします。
あと、フォルダをサブメニュー展開した時、ファイルが多かった場合折り返すというのも出来たんですが、ちょっと試した結果未実装となっています。
というのは、2列程度に広がるくらいのファイル数なら結構便利なんですが、Windowsフォルダのようにファイルが数百もあるような所だと画面いっぱいにメニューが広がってしまって大変使いにくかったのです。
しかも、一度に表示できるメニュー項目の数が増えるためアイコンの取得から描画までに若干時間がかかってました。
まあ、そんなフォルダを展開することは無いと思いますが・・・
2001年07月03日(火) エアコン付いた♪
もらいものだけど、無いよりまし。とあるホームページで「ファイルやフォルダの検索」ダイアログの呼び出し方法が載っていたので、ClockLauncherのおまけ項目に追加しておきました。
IShellDispatch *pShellDispatch;
CoInitialize( NULL );
if ( S_OK == CoCreateInstance( CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pShellDispatch ) )
{
pShellDispatch->FindFiles();// 「ファイルやフォルダを検索」
pShellDispatch->Release();
}
CoUninitialize();
ちなみに、pShellDispatch->FileRun() にすると「ファイル名を指定して実行」になる。
2001年07月02日(月) 雑誌
なんとなく「日経ソフトウェア」と「C MAGAZINE」を買ってみた。意外と初歩的なことから書いてあったので、プログラミングはじめたての学生なんかが読むと為になるだろうなと感じた。
2001年07月01日(日) あぢー
エアコンのない部屋で過ごすのは地獄だ...さて、Windows2000での半透明ウインドウ。
興味本位でつけてはみたものの、まったく意味ない機能ですね(笑
ソースコードは以下のとおりです。
// 1) OSのチェック
GetVersionEx( &os );
if( os.dwPlatformId == VER_PLATFORM_WIN32_NT && os.dwMajorVersion >= 5 )
{
// Windows2000
}
// 2) ウインドウスタイルの変更
LONG exstyle = GetWindowLong( hWnd, GWL_EXSTYLE );
// 0x80000 = WS_EX_LAYERED 半透明ウインドウ
SetWindowLong( hWnd, GWL_EXSTYLE, exstyle | 0x80000 );
// 3) 半透明処理
if( (hDLL = LoadLibrary( "user32" )) )
{
typedef DWORD (WINAPI *PFUNC)( HWND, DWORD, BYTE, DWORD );
PFUNC pFunc = (PFUNC)GetProcAddress( hDLL, "SetLayeredWindowAttributes" );
if( pFunc ) pFunc( hWnd, 0, alpha, 2 ); // alpha = 透明度(0〜255)
FreeLibrary( hDLL );
}
SetLayeredWindowAttributes、
パラメータの渡し方で、カラーキー設定できたりもするので使い方によっては面白い効果が出せそうですね。
2001年06月29日(金) メモリ量表示と、掃除機能
物理メモリ量の表示は、もともとつけたいと思ってたんですがAPI調べてなかった為未実装だったんです。メモリ関係の要望を頂いていたこともあり、ちょっと実装してみることにしました。
メモリ情報の取得には、GlobalMemoryStatus( &m_MemStat );を使い、メモリ掃除は任意のサイズのメモリを一時的に確保しすぐ解放するという方法です。
これによって、OSが保持しているメモリを強制的に解放させるというわけです。
短時間で作成したわりには、それっぽく動いてるようです(汗
2001年06月28日(木) 今日の修正
付箋メモ入力の際、最初から日本語入力モードにするというもの...if ( (himc = ImmGetContext( m_hWnd )) ) {
ImmSetOpenStatus( himc, TRUE );
ImmReleaseContext( m_hWnd, himc );
}
たったの 4行で出来てしまいました(笑
特にデバッグするほどのものでもなく、即アップ。
このくらいの修正だと、楽でいいですね。
あと、デスクトップクリック動作に「新規付箋メモ」の項目を設けました。
2001年06月26日(火) スタートメニュー
今日は、デスクトップダブルクリック動作にスタートメニューを表示させる項目を追加してみました。まず最初に考えた方法は、ウィンドウズキーでスタートメニューが表示されることを利用し、プログラム中からウィンドウズキーが押されたっていうメッセージを送ってみるというもの。
さっそく実装しようとおもったんだけど、肝心のウィンドウズキーのキーコードがわかんない。
VK_...なんだろ?
ためしにVCインストールフォルダでVK_でグレップしてみると...それらしいのが出てきました。
WINUSER.H(373): #define VK_LWIN 0x5B
WINUSER.H(374): #define VK_RWIN 0x5C
これかな?
とりあえず、デスクトップやタスクバーなどにPostMessage( hDesktopWnd, WM_KEYDOWN, VK_LWIN, 0 );な感じでメッセージを送ってみるが上手くいかない。
そもそも、どのウインドウハンドルにメッセージを送ればいいのだろう?
ひょっとして、この方法じゃダメなんじゃ...?
で、次に考えたのがタスクバーのウインドウハンドルからスタートボタンのウインドウハンドルを取得して、マウスクリックのメッセージを送信するというもの。
ためしに書いてみる。
hwnd = FindWindowEx( NULL, NULL, "Shell_TrayWnd", NULL );
hwnd = FindWindowEx( hwnd, NULL, "Button", NULL );
PostMessage( hwnd, WM_LBUTTONDOWN, 0, 0 );
なんだか、今度は上手くいきました(笑
ほんとに、こんなソースコードでいいのでしょうか?
(Windows98でしか動作確認してないです)
2001年06月22日(金) Clock Launcher v1.03
マウスアシスト機能で、ウインドウの中央でなく「OK」「はい」などのボタンに向かわせるため少し細工をしてみました。はっきり言って、不完全でウインドウやダイアログの作成者に依存してます。
というのは、親のウインドウハンドルを使ってFindWindowExでボタンクラスの子供ウインドウを探してるだけだからです。
チェックボックスやラジオボタンもボタンクラスに含まれるので、不規則に配置してあったりするとどこに行くかわかりません...(汗
hChildWnd = FindWindowEx( hParentWnd, NULL, "Button", NULL );
GetWindowRect( hChildWnd ? hChildWnd : hParentWnd, &rc );
Target.x = rc.left + (rc.right - rc.left) / 2;
Target.y = rc.top + (rc.bottom - rc.top ) / 2;
...な感じのソースコード。
もっと良い方法あるよ。...という方いたら教えてください。
あと、デスクトップダブルクリックの動作として、ランチャーメニュー表示の他に任意のプログラムを実行する設定を設けたので、本当に良く起動するプログラムを設定すると便利になるかもしれません。
どうも、メールチェックにバグあるようですね。
Msvcrt.dllのバージョンによって不正落ちするらしいのでメールチェック機能使う方は注意してください。
環境設定の保存は、プログラム終了時に行っていますので不正落ちなどすると設定が保存されません。
もし設定をたくさんした場合は一度終了して起動しなおすと良いでしょう。
2001年06月20日(水) マウスアシスト機能 2
昨日、マウスアシスト機能をつけてはみたものの瞬時にマウスカーソルが別の場所に移動してしまうと、カーソルを見失ってしまうことがあります。やはり移動途中の軌跡も描画してやらないと使いにくい気がするので、さっそく実装してみることにしました。
このような処理をやる場合はタイマーを使うのがお決まりで、とりあえず標準のSetTimer関数を使ってみました。
...が、予想通り精度が悪い。
ミリ秒指定できるにもかかわらず、どう考えてもその精度で動いてくれないのです。
しかたなく、マルティメディアタイマを使用してみたところ今度は気持ち良いくらいスムーズに移動中の軌跡を描いてくれました。
う〜ん、良い感じ。
現時点ではウインドウの中央にしか向かっていかないのですが、やはり「はい」「OK」「確定」などのお決まりのボタンの上に向かって移動してくれたほうが使いやすいですよね?
ボタンの判断が難しいところなので未実装ですが良い判断方法が見つかり次第実装する予定ですので...
2001年06月19日(火) マウスアシスト機能
今日は開発日記を少し...前回、CLHook.dllを作成し外部のメッセージを拾えるようにしたので、できることが少し広がった感じがします。
アクティブなウインドウを追っかけるのもそうだし、デスクトップダブルクリックでメニュー表示するのもそうです。
いまやってみたいと思っているのが、新しく開いたウインドウにマウスが勝手に移動してくれるマウスアシスト機能です。
現時点で私は、BearMouse というソフトをスタートアップに登録して使っているのですが、CLockLauncherにもシンプルでいいからマウスアシスト機能を実装してみたいと思いました。
ということで、さっそく考えてみることにします。
何らかのウインドウが表示されたらそのウインドウの中央にマウスを移動させればいいのだから、WM_SHOWWINDOWメッセージをつかまえてその時のウインドウハンドルからGetWindowRectでウインドウのサイズを取得。
そこからウインドウの中央を計算してSetCursorPosでマウスカーソルを中央に移動する.....だけかな?
なんだ簡単に出来そうじゃん。
実装してみると、上手くいかない。
どうやら、ウインドウ内のボタンやらリストやらスクロールバーやらのWM_SHOWWINDOWメッセージをつかまえてしてしまい、ウインドウの中央でなくボタンの中央だったり、スクロールバーの中央だったり見当外れの位置にマウスが移動しちゃう。
親ウインドウだろうが子供ウインドウだろうが、メッセージ処理してるはずだもんな...などと怪しい解釈をし、ウインドウスタイルが子供ウインドウ(WS_CHILD)だった時は処理しないようにしてみると....ちゃんとウインドウ中央にカーソルが移動してくれるようになった。
う、うれしい。 (こういう小さな喜びがたまらないのです^^)
ニヤニヤしながらテストしてると問題がひとつ。
「ファイル」「編集」やらのメニューを開いたときの、ポップアップメニューにも反応してしまいえらい使いにくいこと、この上ない。
へ〜、これって子供ウインドウじゃなかったのか?などとさらに適当に納得し、ポップアップメニューのウインドウクラスは分かっていたので、これもメッセージ処理しないようにしたところあっけなく解決。
しばらくテストしてみると、またまた問題が。
なぜか「秀丸」に限ってツールチップ(アイコンボタン等の上に出るやつ)にも反応してしまうのです。秀丸のツールチップは自前ウインドウなのか?(謎
いろいろ悩んだあげく、メッセージを受け取ったウインドウハンドルとGetForegroundWindowで取得したウインドウハンドルが一致したときだけ処理すれば上手くいく事が判明しました。
なんか、この方法にしたら子供ウインドウかどうかの判断とポップアップメニューかどうかの判断が必要なくなったのですが...
とりあえず動いたので暫くこれでテストしてみようと思います。
...と、こんな感じで日夜バージョンアップしているのです。
2001年06月13日(水) ClockLauncher v1.00
v0.01からはじめて、やっとv1.00にたどり着きました。ここまで半年以上かけてるけど、自分ではかなり使いやすくなったと思ってます。
まー、自分が一番に使いやすいようカスタマイズしてるんだから当然といえば当然なんですけどねー
でも、そこそこユーザーさまも増えてるみたいで結構うれしいです。
いろいろ機能つけてきてプログラミングの勉強にもなったし、C++,SDK,MFC結構わかってきました。
v1.00から、メッセージフック用のDLLつけたんですが、意外に苦労したのがデスクトップWクリックで出たポップアップメニューがなかなか消えない現象で、いろいろHP見て回ってなんとか回避させたつもりです。
デスクトップWクリックの判断も、これでいいのか?って感じで実装してありますが意外とうまくいってるみたいです。
こう書くと、あやしいげな部分もありますが温かい目で見守ってください。
2000年12月10日(日)
C++FAQなる本を購入普通のマニュアル本と違い、C++に関する
よくある質問をまとめたものなのだけど
これがなかなか面白い
C++使っていて、ふと疑問に思うことが
解説付きで載っているのは良い
しばらくは楽しく読めることと思う
(C++FAQ 〜C++プログラミングをきわめるためのQ&A集〜 より)
2000年11月26日(日)
ふと、ながいことゲームしていないことに気が付いたPS2は誇りまみれ状態だし・・・
久しぶりにゲームしたい気分
で、気になっているのがPSの北斗の拳
絵は荒いけど意外と良い評価なんだよね
買ってみようかな