他のプログラムのウィンドウハンドルを取得する

今回は他のウィンドウハンドルを取得し、何か操作をしたいと思います。私は以前TeX用エディタを 作っていたとき、コンパイルした後にDVIビュアーをアクティブにするいう操作を今回説明する方法を使って していました。
ウィンドウハンドルを取得する方法はいくつかありますので、とりあえず私が使ったことのある二つの方法を 紹介したいと思います。

位置からウィンドウハンドルを取得する

最初の方法はウィンドウの位置からハンドルを取得します。命令は以下のようになります
HWND WindowFromPoint(POINT Point);

簡単なので、命令さえ分かってしまえば説明の必要もないですね。この方法は、エディットコントロールに カットやペーストの処理をするなどメインウィンドウでないハンドルを取得するときは便利なの ですが、前述した指定アプリケーションをアクティブにすると言った操作をするときは、アプリケーションの タイトルが分かっているのに位置を1回1回入力するなんて面倒です。

可視状態のウィンドウハンドルを取得する

今度は、可視状態の(別にそうじゃなくてもいいんですが)ウィンドウハンドルを取得しようと思います。 使う関数はGetTopWindowGetNextWindowです。ヘルプによるとGetTopWindowは 指定したウィンドウハンドルの最もトップレベルの子ウインドウを返し、GetNextWindowが指定した次、または 前のウィンドウハンドルを返すとか何とか書いてあります。(詳しくは不明)。 そこでデスクトップのウィンドウハンドルを取得し、そこからたどれば全てのウィンドウを識別できる はずです。以下にリストを掲載します。

#include<windows.h>
#include<string.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   LPSTR lpszCmdLine,int nCmdShow)

{
    BOOL flag=FALSE;
    char moji[100];
    HWND lhwnd;
    
    lhwnd=GetTopWindow(GetDesktopWindow());
    while((lhwnd=GetNextWindow(lhwnd,GW_HWNDNEXT))!=NULL)
    {
        GetWindowText(lhwnd,moji,sizeof moji);
        if(IsWindowVisible(lhwnd) && strlen(moji))
        {
            //この中にはタイトルがある可視状態のウィンドウが来る
            if(strcspn(moji,"帳") < strlen(moji))//←これまちがってます。
            {
                flag=TRUE;
                SetWindowText(lhwnd,"勝手に変更して申し訳ございません");         
            }
        }
    }
    if(flag)
        MessageBox(NULL,"変更しちゃいました","",MB_OK);
    else
        MessageBox(NULL,"帳をタイトルに含むアプリケーションが\r\nありませんでした","",MB_OK);
    return 1;
}

IsWindowVisibleで可視状態かどうか調べています。
あっ!!!
今、気が付いたんだけど、一番最初に獲得したウィンドウハンドルに関してはチェックしてないぞ
でもまぁ各自変更してもらえばいいか。それでは(逃げ)

戻る