2010-11-26

Old New Thing:戦うプログラム

What if two programs did this? Practical exam - The Old New Thing - Site Home - MSDN Blogs

このブログを読んだことのない顧客が、次のような質問をしてきた。

我社のアプリをあらゆるウィンドウの上に表示したいのです。たとえ、他のウインドウがtopmostスタイルを使っていたとしてもです。我社のアプリは、 WM_KILLFOCUSとWM_PAINTメッセージで、topmostに設定し、SetWindowPosでウインドウを一番上に引き上げています。その後、念のためSetForegroundWindowも呼び出しています

結果を申しますと、我社のアプリと他のアプリが競合して、お互い一番上に表示させようとし続けます。どうも、他のアプリも同じような仕組みを使っているらしいのです。また、あるアプリなどは、我社の仕組みを打ち負かし、我社のアプリの上に表示されます。(そのアプリは他社のものなので、どうしようもできないのです)

我社は今、すべてのウインドウに対するすべてのメッセージをフックするためのDLLを書いていて、さらに[ここに書くべき価値もない馬鹿げたトリック]もする予定です。しかし、今の実装では、フックした他のアプリをクラッシュさせてしまうのです。我社は、タイマーを使ってSetWindowPosを周期的に呼び出すことも検討しているのですが、それは非効率的だと思うのです。

この顧客はWhat if two programs did this?のような思考実験すらできないようだ。思考実験のかわりに、実際に実験してしまうとは驚きだ。実験結果は、ただ予想通りというしかない。二つのプログラムがお互いに、一番上になろうとして戦うのである。誰も勝てはしない。皆負ける。とくに、最大の敗者はユーザーである。

ときどき、なぜこんなバカなことをする人間がプログラミングをできるのか、本気で考え込んでしまう。

No comments: