2012-05-27 4 views
1

콘솔 응용 프로그램 내부 - GetOpenFileName()Handle := FindWindow(Nil, Pchar(ConsoleTitle))은 콘솔 창에 대한 OpenFile 대화 상자를 보여줍니다. 자신의 양식을 만들고 표시 할 수 있습니까?은 (는) 콘솔 창에 모달입니까?콘솔 창에 양식 모달을 만드는 방법

+0

왜 콘솔 앱을 열면 대화 상자가 열리나요? –

+0

@WarrenP - 이전 cobol 콘솔 앱이 있습니다. GUI 솔루션을 사용할 준비가 된 몇 가지 기능 (열 선택으로 execl 파일 가져 오기 ...)을 추가해야합니다. 나를 위해이 GUI 애플릿은 콘솔 창에 모달 인 경우에만 허용됩니다. – Branko

답변

4

콘솔 창을 양식의 창 소유자로 설정하고 양식을 표시 할 때 설정을 해제하십시오. 다음과 같은 것 :

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    windows, 
    forms, 
    Unit1 in 'Unit1.pas' {Form1}; 

const 
    ConsoleClass = 'ConsoleWindowClass'; 

var 
    console: HWND; 
    len: DWORD; 
    title: array [0 .. MAX_PATH] of Char; 

begin 
    try 
    len := GetConsoleTitle(title, SizeOf(title)); 
    Win32Check(Bool(len)); 
    console := FindWindow(ConsoleClass, title); 
    Win32Check(Bool(console)); 
    Form1 := TForm1.Create(nil); 
    try 
     EnableWindow(console, False); 
     try 
     Form1.HandleNeeded; 
     SetWindowLongPtr(Form1.Handle, GWLP_HWNDPARENT, console); 
     Form1.ShowModal; 
     finally 
     EnableWindow(console, True); 
     end; 
    finally 
     Form1.Free; 
    end; 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
end. 
+0

감사합니다! Form1.HandleNeeded; 및 SetWindowLong (Form1.Handle, GWL_HWNDPARENT, console); 내가 필요한 것입니다 :) – Branko

+0

이 코드는 명시 적으로 어쨌든 완료되었을 특정 작업을 수행하는 것 같습니다. 'Handle' 속성을 읽는 것이 이미'HandleNeeded'를 호출하지 않았습니까? 그리고 부모 콘솔 창을'ShowModal'하지 않을 것인가? –

+0

@Rob - (1) 분명히 그렇습니다. (2) 아니요, 콘솔 창은'DisableTaskWindows' 호출 인'EnumThreadWindows'로 열거되지 않습니다. –

관련 문제