Delphiで作ったCGIでFindWindowが効かない


mook  2009-10-25 20:50:01  No: 35965

タイトル通りですが、Delphiで作ったCGIの中で
FindWindowが効かないのですが原因が分かりません。

function TWebModule1.test(FormCaption:string):integer;
var
  hd: HWND;
begin
  hd := FindWindow(nil,pchar(FormCaption));
  result := hd;    // 0になる
end;

【環境】
・WinXP SP2 /Delphi5

他のファイル関連などの関数やAPI等は問題ないのですが
FindWindowは使えないのでしょうか。

どなたか経験のある方はいらっしゃいませんか?
よろしくお願いします。


もしかして  2009-10-26 02:20:15  No: 35966

探してるものがトップレベルWindowじゃなかったりして.....


mook  2009-10-26 03:26:17  No: 35967

もしかして さん、ありがとうございます

一応確認の為に、別立てで(下記ソース)
  1.FindWindowでのプログラム検索機能
  2.EnumWindowsProc(コールバック関数)での一覧リスト作成
..を可能にした、DLLを作成しまして

■一般PGのテスト用プログラム(test2.exe)を作りまして
  上記 1&2 をテストしますと

1. 目的のトップレベルWindowフォーム名(モニター)が処理出来ます。
  (例: Handle=999999)
2. 現在、起動されている複数のフォーム名等が出てきます。
  (例: 受信トレイ - Outlook Express / Delphi 5 - Test ..etc)

■しかし、CGIプログラム(index.cgi)でこの dllを呼びますと

1. 目的のトップレベルWindowフォーム名(モニター)でハンドルが取れません。
  (例: Handle=0)
2. 何か視点?の違う名称が出てきます。
  ( Zend Timeout Window / ModemDeviceChange / BadApplicationNotificationWindow ..etc)

因みに目的のプログラムは自作のもの(test.exe)で
フォームには「モニター」のような文字が入っています。

以上のように通常のプログラムとCGIでの動作が違う様です。
このような結果になる事は概略分かってきましたが、対策が取れません。

それとも、CGIベースでは出来ないのでしょうか。
よろしくお願いします。

-- 以下、多少手抜きリストですが -----------------

//---------------------------------------------
function fm_find(cap_str:PChar;hd:HWND): BOOL; stdcall;
begin
  result := false;
  hd := FindWindow(nil,cap_str);
  if hd<>0 then begin
     result := true;
  end;
end;

//---------------------------------------------
function EnumWindowsProc(hwindow :HWnd; lparam :LPARAM):BOOL; stdcall;
var
  PC   :PChar;
  Len  :integer;
  Name :string;
begin
  Result :=false;
  if hWindow <> 0 then begin
    GetMem(PC, 500);
    Len :=GetWindowtext(hWindow, PC, 500);
    setstring(Name, PC, Len);
    if Name <> '' then begin
       p_enum(lParam)^.add('[hd='+inttostr(hWindow)+']:'+Name);
    end;
    FreeMem(PC);
    Result :=true;
  end;
end;

//---------------------------------------------
function fm_list(slist:PChar): BOOL; stdcall;
var
  StrList:TstringList;
begin
  StrList := TStringList.Create;
  EnumWindows(@EnumWindowsProc, LParam(@StrList));
  StrCopy(slist, PChar(StrList.Text));
  StrList.Free;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加