Win32API

ウィンドウメッセージの処理でSleepは応答なしになるのにMessageBoxは応答なしにならない理由

例えば、ボタンを押すと送られるBN_CLICKEDを検出して、そこにボタンを押したときの処理を記述しますが、シングルスレッドなので、何も工夫しなければSleepで処理を止めるとメインウィンドウが応答しなくなります。 ところが、MessageBoxだと処理は止まって…

夏目あさ子はかわいい顔してC言語でWin32APIを叩く

となりの怪物くん4巻カバー下表紙に、ミニゲームを作るのにはまっていると言いながらプログラミングしている夏目さんが描かれていますが、パソコンの画面にソースコードが細かい文字で書かれています。以下に見える範囲で引用します。 hBit = (HBITMAP)LoadI…

EditBoxのウィンドウハンドルしか持ってない場合の文字列取得方法

自プロセスのウィンドウハンドルの場合はGetWindowText関数で取得可能です。 また、他プロセスのウィンドウハンドルの場合はSendMessage関数で、ウィンドウハンドルにWM_GETTEXTを送って取得できます。 WM_GETTEXT EditBoxのウィンドウハンドルに対して、Get…

他プロセスにウィンドウメッセージでアドレスを送るときに何も考えないで送れるのはWM_SETTEXTとWM_COPYDATA

各プロセスで仮想アドレス空間は独立しているということで、あるプロセスに別のプロセスのアドレスを送ってもそのアドレスにはアクセスできません。 WM_SETTEXTとWM_COPYDATAはAPIがコピーしてアクセスできるようにしてくれていて問題なく送れるようですが、…

HTAでHTAタグを使ったらGetParentでオーナーウィンドウを取得できなくなった

GetWindowのGW_OWNERで解決しました。

直す

WScript.ShellのRunメソッドなんですが、第二引数を0にして汎用Rundll32でShowWindow(hwnd, SW_SHOW)を呼び出したらうまくいきませんでした。 SW_SHOWをするにはアプリケーションがアクティブになってる必要があるようです。それと、汎用Rundll32にバグがあ…

WSHやバッチファイルからWin32APIを呼び出す

WSHでDLLの関数を呼び出せるツールにSFC miniというものがありますが、これはどうやらインストールという作業が必要みたいで、配布の障壁になるかなぁと思っていました。 簡単な用途であれば、以前作った汎用Rundll32でもいけるので、簡単ではありますがサン…

HTAのWindowがちょっとおかしい件について

FlashWindowでHTAのタスクバーを光らせたあと、アクティブにしても点滅状態が元に戻らないので、これはどういうことかと思って調べていました。 WindowExplorerでmshta.exeの持っているウィンドウを見てみたところ、謎の隠しウィンドウがあったので表示させ…

Windowsでコマンドライン引数に改行などが使えることを確認した

a.exe #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(0,lpCmdLine,0,0); } a.js (new ActiveXObject("WScript.Shell")).Run("a.exe a\ta\r\nb"); Win98とWin2000でも使えました</windows.h>…

Windowsのコマンドラインに文字コードがある(?)のか?と考えたけど違う

CommandLineToArgvWのページにUnicode ワイド文字で渡されたコマンドライン文字列を解析とあるので、コマンドラインに文字コードがあるのか?あるならどうやって文字コードを判定するんだ?と思いましたが、以下のプログラムをテストしてそういうことではな…