2009-10-15 1 views
2

Delphi 코드를 사용하여 프로그램을 시작하고 "명령"을 실행하여 동작을 수행합니다.이 경우에는 버튼을 클릭하십시오.응용 프로그램의 특정 단추 클릭에 대한 명령 줄 매개 변수는 어떻게 얻습니까?

명령 줄을 사용하여 프로그램을 시작할 수 있지만 버튼 클릭에 올바른 매개 변수가 필요하다는 것을 알고 있습니다. 어떻게 또는 어디에서 찾을 수 있습니까?

+1

충분히 구체적이지 않았습니다. 임씨는 한 회사에서 인터 션을하면서 제품 (하드웨어 장치 및 소프트웨어)을 구입했습니다. 소프트웨어는 원하는대로 정확하게 수행하지 못하기 때문에 소프트웨어가 장치와 통신하도록 명령하고 텍스트 파일에 데이터를 저장하는 방법을 찾고있었습니다 (이 경우 버튼이 있음). 나는 내 자신의 프로그램을 사용하여 텍스트 파일을 읽고 그걸로 할 수 있었다. – Makaku00

+0

당신은 행운이 아닐 수도 있습니다 - 회사가 버튼을 클릭하라는 매개 변수를받을 것으로 예상되는 실행 파일을 개발하지 않았다면 아무 것도 할 수 없을 것입니다. COM Interop를 통해 노출 된 소프트웨어가 있는지 확인하고 소프트웨어를 그런 방식으로 조작 할 수 있습니다. – Knobloch

+0

명령 행으로 가서 'progname.exe /?'를 사용하여 매개 변수에 관해 알려주는 것을 볼 수 있습니다. - 명령 줄 매개 변수 옵션을 다시 표시하는 표준 방법 중 하나입니다 ... – Knobloch

답변

1

Delphi는 ParamCount 및 ParamStr과 같은 매개 변수를 선택할 수있는 두 가지 전역 변수를 제공합니다.

ParamStr (0)은 항상 실행중인 실행 파일의 전체 경로와 파일 이름입니다.

그런 다음 매개 변수가 무엇인지는 사용자에게 달려 있습니다. 이 매개 변수가 "clickbutton"라고 싶다면, 다음 엑 파일에서 Application.Run 전에 같은 것을 할 :

var 
    i: Integer; 

for i := 0 to ParamCount Do 
if (Lowercase(ParamStr(i)) = 'clickbutton') then 
    Form1.Button1.Click; 

을 그럼 프로젝트가 명령 행 호출되는 경우 :

project1.exe clickbutton 

Button1이 Form1에서 클릭됩니다.

+0

빠른 응답을 주셔서 감사합니다. 내 서면 프로젝트에서 작동합니다. 내 문제는 내가 (폐쇄 소스) 실행 파일을 시작하고 내 자신의 델파이 프로그램을 사용하여 특정 동작을 수행하도록 명령하고 싶다는 것입니다. 폐쇄 형 소스 소프트웨어의 매개 변수를 가져 오는 데이 방법을 사용할 수 있습니까? – Makaku00

+1

아니요, 프로그램이 매개 변수를 가져 와서 특정 작업을 수행하도록 설계되지 않은 한 Knobloch가 말했듯이, 프로그램에 매개 변수를 "주입"할 수 없습니다. 그렇지 않으면 거기에 모든 종류의 소프트웨어로 지불 할 지옥이있을 것입니다. 그가 말한대로 /를 사용하여 exe를 실행 해보십시오. 명령 줄에서 프로그램이 수락하는 매개 변수가 있는지 확인하십시오. 그렇지 않으면 방법이 없습니다. –

9

GUI 응용 프로그램을 자동화하기 위해 설계된 AutoIt과 같은 프로그램을 사용할 수 있습니다. 예를 들어 AutoIt은 프로그램을 실행하고 해당 프로그램의 창로드를 기다린 다음 해당 창에서 버튼 클릭을 시뮬레이션 할 수 있습니다.

이것은 이상적인 상황과는 거리가 있습니다. 명령 줄 매개 변수 또는 COM Interop은 훨씬 더 신뢰할 만하지만 작동합니다.

AutoIt은 COM 또는 DLL 버전으로도 제공되므로 Delphi 앱에서 직접 사용할 수 있습니다.

3

다른 응용 프로그램을 원격 제어 할 수 있지만 최신 버전의 Windows (Vista/Win7)에서는 제어중인 프로그램과 프로그램이 동일한 프로세스 수준에서 실행중인 경우에만 작동합니다. (두 앱 모두 예를 들어 관리자로 실행되지 않음). 원하는 것은 FindWindow API를 사용하여 버튼의 윈도우 핸들을 찾은 다음 해당 핸들에 적절한 마우스 메시지를 보내는 것입니다. 서로 다른 응용 프로그램이 다르게 작동하기 때문에 메시징을 올바르게 수행하려면 약간의 실험이 필요합니다. 나는 WM_MOUSEDOWN과 WM_MOUSEUP이 일반적으로 당신이 보내고 자하는 것이라고 생각한다.

1

Automise이 적합한 도구 일 수 있습니다. 코드를 작성할 수도 있지만 버튼 하나만 누르면 너무 복잡 할 수 있습니다.

3

나는보다 강력한 방법으로 명령 줄 인수를 구문 분석하기 위해 아래의 단위를 작성했습니다. 자유롭게 사용하십시오. 단위 뒤에 예제 사용법을 포함했습니다 (맨 아래로 스크롤).

unit CLArgParser; 
//this class makes it easier to parse command line arguments 
interface 

uses 
    Classes; 

type 
    strarr = array of string; 

type 
    TCLArgParser = class 
    private 
    FPermitTags : array of string; 
    FTrimAll: boolean; 
    public 
    function IsArg(argtag : string) : boolean; 
    function GetArg(argtag : string) : string; 
    function GetDelimtedArg(argtag, delimiter : string) : TStringList; 
    constructor Create(ArgTags : array of string); overload; 
    constructor Create; overload; 

    property TrimAll: boolean read FTrimAll write FTrimAll; 
    end; 

implementation 

uses 
    SysUtils; 

const 
    cDefaultTags : array[0..1] of string = ('-','/'); 

constructor TCLArgParser.Create(ArgTags : array of string); 
var i : integer; 
begin 
    try 
    SetLength(FPermitTags,High(ArgTags)+1); 
    for i := 0 to High(ArgTags) do begin 
     FPermitTags[i] := ArgTags[i]; 
    end; //for i 
    except on e : exception do 
    raise; 
    end; //try-except 
end; 

constructor TCLArgParser.Create; 
begin 
    FTrimAll := False; //default value 
    inherited Create; 
    Create(cDefaultTags); 
end; 

function TCLArgParser.GetArg(argtag: string): string; 
var i,j,n : integer; 
begin 
    try 
    Result := ''; 
    n := High(FPermitTags); 

    for i := 1 to ParamCount do 
     for j := 0 to n do 
     if Uppercase(ParamStr(i)) = (FPermitTags[j] + Uppercase(argtag)) then 
      Result := ParamStr(i+1); 

    if FTrimAll then begin 
     Result := Trim(Result); 
    end; 
    except on e : exception do 
    raise; 
    end; //try-except 
end; 

function TCLArgParser.GetDelimtedArg(argtag, delimiter: string): TStringList; 
var i : integer; 
    argval, tmp : string; 
begin 
    try 
    Result := TStringList.Create; 
    argval := GetArg(argtag); 

    for i := 1 to Length(argval) do begin 
     if ((i = Length(argval)) or ((argval[i] = delimiter) and (tmp <> ''))) 
     then begin 
     if i = Length(argval) then begin 
      tmp := tmp + argval[i]; 
      if FTrimAll then begin 
      tmp := Trim(tmp); 
      end; 
     end; 
     Result.Add(tmp); 
     tmp := ''; 
     end //if we found a delimted value 
     else begin 
     tmp := tmp + argval[i]; 
     end; //else we just keep looking 
    end; //for ea. character 

    except on e : exception do 
    raise; 
    end; //try-except 
end; 

function TCLArgParser.IsArg(argtag: string): boolean; 
var i,j,n : integer; 
begin 
    try 
    Result := False; 
    n := High(FPermitTags); 

    for i := 1 to ParamCount do begin 
     for j := 0 to n do begin 
     if Uppercase(ParamStr(i)) = (FPermitTags[j] + Uppercase(argtag)) 
     then begin 
      Result := True; 
      Exit; 
     end; //if we found it 
     end; //for j 
    end; //for i 
    except on e : exception do 
    raise; 
    end; //try-except 
end; 

end. 

사용 예제 :

procedure DefineParameters; 
var 
    clarg: TCLArgParser; 
begin 
    //assign command line arguments to various global variables 
    clarg := TCLArgParser.Create; 
    try 
    wantshelp := clarg.IsArg('?') or clArg.IsArg('help'); 

    dbuser := clarg.GetArg('u'); 
    dbpwd := clarg.GetArg('p'); 
    dbserver := clarg.GetArg('d'); 

    localfilename := clarg.GetArg('localfile'); 

    ftpuser := clarg.GetArg('ftu'); 
    ftppwd := clarg.GetArg('ftp'); 
    ftpipaddr := clarg.GetArg('fti'); 

    emailfromacct := clarg.GetArg('efrom'); 
    emailtoacct := clarg.GetArg('eto'); 

    archivefolder := clarg.GetArg('archive'); 
    if archivefolder <> '' then begin 
     if archivefolder[Length(archivefolder)] <> '\' then begin 
     archivefolder := archivefolder + '\'; 
     end; 
    end; 

    //figure out the (optional) verbosity code. 
    //if they didn't specify, assume the default value 
    verbosity := c_VerbosityDefault; 
    if clArg.IsArg('v') then begin 
     if not(TryStrToInt(clarg.GetArg('v'),verbosity)) then begin 
     WriteLn('Invalid verbosity code- using default of ' + 
      IntToStr(c_VerbosityDefault) + '.'); 
     end; //if their specified verbosity was invalid 
    end; //if they specified the verbosity 

    if not(TryStrToInt(clarg.GetArg('maxtime'),maxtime)) then begin 
     maxtime := 9999999; 
    end; 
    finally 
    FreeAndNil(clarg); 
    end; //try-finally 
end; 
0

체크 아웃 AutoHotKey. 키 클릭을 프로그래밍 할 수 있습니다. 무료이며 오픈 소스이며 가볍고 프로그래밍이 가능합니다. 그것은 사용자 커뮤니티로부터 상당한 지원을 받고 있으며 거기에 몇 가지 유용한 유틸리티가 있습니다. Lifehacker web site에서 수행 할 수있는 작업의 몇 가지 예가 있습니다.

2

알아 두어야 할 것은 프로그램이 버튼 클릭에 대해 어떻게 알 수 있는지입니다.이를 위해 Delphi 또는 Spy ++와 함께 제공되는 WinSight를 사용할 수 있습니다. 프로그램을 실행하고,이 도구 중 하나를 사용하여 메시지 청취를 시작하고 단추를 클릭하여 어떤 일이 발생하는지 확인하십시오. 대부분의 경우 WM_COMMAND 메시지에 관심이있을 것입니다 (Spy ++의 정보량을 줄이기 위해 다른 모든 메시지를 필터링 할 수 있습니다). WM_COMMAND 메시지의 wParam 및 lParam에 저장된 값을 단추를 클릭하면 어떻게되는지 검사합니다. Spy ++에서 프로그램 창의 클래스 및/또는 제목을 읽고이를 앱의 FindWindow에서 사용하십시오. 그런 다음 SendMessage를 사용하여 검색된 메시지와 해당 매개 변수를 가져온 창 핸들에 보내고 꺼내십시오. 때때로 메시지는 WM_COMMAND가 아니지만 다른 경우에는 더 이상 올바른 것을 찾아야합니다.