こんにちは。
指定フォルダに追加された.pdfファイルをAdobe Readerで表示して、新しく表示された
pdfのウインドウを古いpdfのウインドウの下に表示させるプログラムを作っています。
1.CreateProcessにてAdobe Readerを起動させてウインドウを作る。
2.ProcessIdから作成されたpdfウインドウのハンドルを探す。
3.そのウインドウハンドルを使用してウインドウを操作する。
この流れでウインドウを操作しようと考えましたが、EnumWindowsで有効なウインドウの
ハンドルが帰ってきません。ここで詰まってしまっています。
1.表示した.pdfを前面に持ってきたり、サイズ、位置を変える方法 もしくは
2.表示された.pdfの有効なウインドウハンドルを取得する方法
についてご教示いただけないでしょうか?
BOOL CALLBACK EnumWindowProc(HWND hwnd,LPARAM lp)
{
DWORD processId = 0;
GetWindowThreadProcessId(hwnd,&processId);
if( gProcessId == processId){
gTargetHWND = hwnd;
return FALSE;
}
return TRUE;
}
//本体コード抜粋*************************************************************
if( false == CreateProcess(NULL,(LPTSTR)temp.c_str(), NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &startinfo,&processinfo) )return false;
gTargetHWND = 0;//EnumWindowsで最終的にここにウインドウハンドルが入ります。
gProcessId = processinfo.dwProcessId;
EnumWindows(EnumWindowProc,0);
....
SetForegroundWindow(gTargetHWND);
ご存じかもしれませんが、起動中のウインドウのウインドウクラス名称や、
プロセスIDを調べるには、コンパイラのSDKに付属しているツールである
「spy++」を使用します。
さて、自分のWindows 7で「Adobe Reader」を立ち上げてみたところ、
11.0.06が起動しました。
このバージョンのではフレームウインドウのウインドウクラス名称が、
AcrobatSDIWindowであるため、EnumWindowProc()内で、
GetClassName()を使ってクラス名称が上記であるか調べる方法もとれます。
この方法で、一致するウインドウを見つけ、この時、
プロセスIDが一致しない理由を探してみるのが良いかもしれません。
もちろん先のspy++で予めプロセスIDを知っておく方法も可能です。
仲澤@失業者/(自宅)・・・眠れんっ(しくしく)
仲澤@失業者様、返信ありがとうございます。
spy++、今まで知りませんでした。教えていただきありがとうございます。
そのspy++でプロセスとウインドウを見てみましたが、プロセスから取得したハンドルは
AcrobatSDIWindowではなくて別のDDEMLEventというウインドウだったようです。
そこで、クラス名をAcrobatSDIWindowで列挙して、(複数起動時はウインドウ名で区別)
ハンドルを取得して操作してみましたが、だめでした。
スキャンのソフトのControlCenterにて窓口で受け取った処方箋をスキャン、調剤室の
パソコンに転送していましたが、新しく転送された.pdfがどうしても上になってしまい、
調剤しづらい、ということでどうにか古い.pdfを表のままにできないか?ということで
作成しておりました。
Adbeのウインドウの作り方が特殊なのかな?とおもい、Adobe以外の表示ソフト(とりあ
えずはMSPaint)でやってみようかな、と思っております。
ありがとうございました。
とりあえずまた自力でやってみて、詰まったらまた質問させていただくかもしれません。