0

create process를 사용하여 연 프로세스에 문자열을 보내려면 어떻게해야합니까? 내가 유래 여기 발견 한 것을의 도움으로 이런 일을 작성했습니다델파이 7에서 Createprocess로 연 프로세스에 문자열 또는 정보를 보내려면 어떻게합니까?

:

var 
    StartUpInfo:TStartUpInfo; 
    ProcessInfo: TProcessInformation; 
    Creationflags: Cardinal; 

    FillChar(StartUpInfo, sizeOf(TStartupinfo),0); 
    StartUpInfo.cb := SizeOf(StartupInfo); 
    Creationflags := NORMAL_PRIORITY_CLASS; 

    if Createprocess(nil, Pchar('c:\program files\adobe\reader 9.0\reader\acrord32.exe' 
    + ' ' + '/h /O /N /T "c:\ps\test2.pdf" "Generic printer"'),nil, nil,False, 
    creationflags, nil, 0 , StartUpInfo , ProcessInfo) then 

    begin 
     WaitForSingleObject(ProcessInfo.HProcess, infinite); 
     begin 
      //write some information into the process (a window that opens in 
      //acrobatreader) and then I want to press the enter button    
     end; 
     CloseHandle(processinfo.hProcess); 

    end; 

그래서 내가 원하는 과정 (오른쪽의 WaitForSingleObject 후) 완료 라인을 작성하는 것입니다 "입력"버튼을 누른 다음 작업이 끝나면 마침내 프로세스를 닫습니다. 누구나 외부 프로세스와 상호 작용하는 방법을 알고 있습니까? 프로그래밍에 관해서는 완전히 초보자입니다.

안부

답변

4

문서를 인쇄하려면 Acrobat Read를 프로그래밍 방식으로 시도하는 것 같습니다. 문제는 사용자 상호 작용을 요구하지 않고 설득 할 수 없다는 것입니다.

프로세스가 종료 될 때까지 기다리고 있기 때문에 현재 코드가 작동하지 않습니다. WaitForSingleObject에 대한 간단한 호출로 시작하면 프로세스가 종료 될 때까지 코드를 실행할 수 없습니다. 코드를 클릭하면 해당 버튼을 클릭 할 기회가 없습니다.

다른 대기 전략을 사용하면됩니다. 이것이 상당히 거친 해킹 인 것 같아서, 내가 보통 제안하지 않는 것, 즉 폴링을 제안 할 것입니다. 무한 타임 아웃을 기다리는 대신 루프 아웃 타임 아웃 값 (예 : 250ms)을 기다려야합니다. 대기가 종료 될 때마다 프로세스가 종료되었는지 또는 대기 시간이 초과되었는지 여부를 확인합니다.

대기 시간이 초과되면 찾을 대화 상자 창이 나타납니다. FindWindowEx()으로 찾을 수 있습니다. Spy ++를 사용하여 클래스 이름을 검색 할 수 있습니다. 대화 상자 창을 찾았 으면 편집 컨트롤과 클릭하려는 창 핸들을 찾으십시오. EnumChildWindows()이 트릭을 수행해야합니다.

조작하려는 컨트롤의 핸들이 있으면 조작 방법을 알아 내야합니다. 운이 좋다면 SetWindowText으로 전화를 걸어 문자열을 보낼 수 있습니다 (EDIT 컨트롤 또는 유사한 경우). 그렇지 않으면 키 누름을 가짜로 만들거나 WM_PASTE를 보내야 할 수도 있습니다. 버튼이 더 골칫거리가 될 수 있습니다. 이를 클릭하면 WM_COMMAND가 버튼 parent에 전송됩니다. 다시 Spy ++는 버튼을 클릭 할 때 어떤 메시지가 전송되는지 보여줍니다.

아직 표시되지 않았기 때문에 FindWindowEx()으로 전화하면 창을 찾을 수 없습니다. 그런 상황이 발생하면 WaitForSingleObject()으로 전화를 걸어 루프를 다시 돌립니다.

마지막으로 PDF를 인쇄하기위한 전용 소프트웨어 라이브러리를 사용하는 것이 더 나은 방법입니다.

+0

키 스트로크를 편집 컨트롤에 적용하려면 WM_Down, WM_KeyPress 및 WM_KeyUp 시퀀스가 ​​필요하지 않습니까? 그가 문자열을 보내길 원한다고 말했다. –

+0

@JamesB OK, 나는 그 비트를 놓쳤다. SetWindowText를 사용하는 것이 더 쉬울 수도 있습니다. –

0

당신이 원하는 것은 매우 명확하지 않다.

프로세스에 물건을 보내려면 여러 가지 방법이 있습니다.

  • OLE 자동화 (예 : MS 워드)있는 CmdLine를 통해
  • (예 : notepad file.txt) STDIN을 통해
  • (예 : 전용 표준의 IO를 사용하여 cmd를 응용 프로그램) 조작을 통해
  • (예 : 전송 특정 WM 메시지를 특정 프로세스 창에 표시)

내가 본 것처럼 마지막 접근 방법이 필요합니다.

기본적으로 올바른 Windows API 함수를 실행하여 프로세스에서 창 목록을 가져옵니다. 그런 다음 winspy, winspy ++ 또는 delphi (델파이 도구 메뉴에있는 것)라는 프로그램을 사용하십시오. 이 도구를 사용하여 메시지를 보내려는 창의 클래스 이름을 찾고,이 특정 패키지를 찾을 때까지 모든 창을 코드 필터로 필터링 한 다음 SendMessage API를 사용하십시오.

복잡하게 들리는 (초보자 용)입니다. 나는 주위에 당신이 몇 가지 자습서를 검색하는 것이 좋습니다. 이 코드는 5 개 이상의 서로 다른 API 호출을 사용하며 콜백을 사용해야한다고 확신합니다.

관련 문제