Q&A

  • 며칠째 같은 질문만 올리고 있습니다... 도와주세요~
어디서 보니까 SetParent(); 로 핸들을 넘겨주니까

새로띄우는 프로그램이 Parent 창에 쏙 들어가더라구요...

(델파이는 아닌것 같어용...)

// 실행시키고
  ShellExecute(Handle,
               'open',       // open
               'IQM.EXE',    // program file
               cc,           // Parameters
               Pchar(path),  // default directory
               SW_SHOWNORMAL);
// 핸들찾아서
  wndIQM := findwindow('IQM',nil);
// 델파이로 핸들 넘겨준다.
  Windows.SetParent(wndIQM,Handle);

이렇게 했는데 자꾸만 따로 떠서리 혼자 돌아다니더라구요...

Findwindow 의 결과값이 핸들 맞나요?

0 이 나오는것 같은데...

뭐가 잘못된 건지 좀 알려주세요...
2  COMMENTS
  • Profile
    강인규 2002.10.24 03:34
    findwindow의 결과값이 핸들은 맞지만..^^;;

    사용법이 잘못되었네요.

    첫번째 파라메터에는 클래스명을 두번째에는 윈도우명을 적어줘야 하는데

    findwindow('TForm1', 'Form1');

    그리고 그 프로그램이 여러개 뜬다면 실행시킨 프로그램이 들어간다는 보장도 없을 듯 하네요. (기억이 맞다면 제일 처음에 뜬 실행화일의 핸들을 리턴할겁니다.)

    예전에 다른분이 짜놓은 코드가 있길래 첨부합니다.

    이건 익스플로러네요.

    즐프하세용 ^-^


    function WinExecEx(FileName: string; Visibility: Integer): DWORD;
    var
      zAppName: array[0..512] of char;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
    begin
      Result := 0;
      StrPCopy(zAppName, FileName);
      FillChar(StartupInfo, Sizeof(TStartupInfo), #0);
      with StartupInfo do
      begin
        cb := Sizeof(TStartupInfo);
        dwFlags := STARTF_USESHOWWINDOW;
        wShowWindow := Visibility;
      end;

      if not CreateProcess(nil, zAppName, nil, nil, False, NORMAL_PRIORITY_CLASS,
        nil, nil, StartupInfo, ProcessInfo) then RaiseLastWin32Error
      else
      begin
        WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
        Result := ProcessInfo.dwThreadId;
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
      end;
    end;

    function EnumThreadWindowsProc(hWnd: HWND; var Param: HWND): BOOL; stdcall;
    begin
      Result := True;
      if (GetWindowLong(hWnd, GWL_HWNDPARENT) = 0) and (IsWindowVisible(hWnd) or
        IsIconic(hWnd)) and ((GetWindowLong(hWnd, GWL_EXSTYLE) and (WS_EX_WINDOWEDGE
          or
        WS_EX_APPWINDOW)) <> 0) then
      begin
        Param := hWnd;
        Result := False;
      end;
      
    end;

    function WindowFromThreadId(AThreadId: DWORD): HWND;
    begin
      Result := 0;
      EnumThreadWindows(AThreadId, @EnumThreadWindowsProc, HWND(@Result));
    end;

    procedure TMainForm.btnStartClick(Sender: TObject);
    var
      hWnd: Windows.HWND;
    begin
      IEThreadId := WinExecEx('C:Program FilesInternet ExplorerIEXPLORE.EXE',
        SW_MINIMIZE);
      Sleep(500);
      hWnd := WindowFromThreadId(IEThreadId);
      if hWnd > 0 then
      begin
        Windows.SetParent(hWnd, Handle);
        SetWindowPos(hWnd, 0, 0, 0, ClientWidth, ClientHeight, SWP_NOZORDER or
          SWP_SHOWWINDOW);
      end;
    end;

    procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      PostThreadMessage(IEThreadId, WM_CLOSE, 0, 0);
      //메인폼이 닫힐때 같이 닫는다.
    end;



  • Profile
    수서니 2002.10.24 04:24
    if createprocess(nil, Pchar(path), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin
        showmessage('실행완료');
        wndIQM := findwindow(nil,'IQM');
        Windows.SetParent(wndIQM,Handle);
    end;

    이렇게 했더니

    응용프로그램이 제대로 초기화돼지 못했다고 합니다.

    이구...

    Createprocess 의 사용법좀 자세히 알려주세요........

    (너무 바라는게 많은가..... -.-;;; )