2016-09-12 18 views
0

"이미지"와 같이 이름을 사용하여 전경에 창을 놓아야합니다.응용 프로그램을 전경에 놓기

findWindowW(NULL, stringName) 

와 나는 과정 (HWND)에 핸들을 얻는다. 그런 다음

SetForegroundWindow(windowHandle); 

와 나는 자동으로 전경에 넣어 생각,하지만 난 '입력'눌러야합니다. 내가 잘못한 일을하고 있거나 다른 일을 할 수 있습니까? 프로세스의 PID도 사용할 수 있습니다.
마지막으로 CTRL + V와 같은 바로 가기를 포 그라운드로 보낸 후 프로세스로 보냅니다. 고맙습니다.

답변

1

MSDN

에서이 시스템은 전경 창을 설정할 수 있습니다 처리하는 제한합니다. 다음 조건 중 하나에 해당하는 경우에만 프로세스가 전경 창을 설정할 수 있습니다.

  • 프로세스가 포 그라운드 프로세스입니다.
  • 프로세스는 포 그라운드 프로세스로 시작되었습니다.
  • 프로세스가 마지막 입력 이벤트를 수신했습니다.
  • 포 그라운드 프로세스가 없습니다.
  • 프로세스가 디버깅 중입니다.
  • 전경 프로세스가 현대 응용 프로그램 또는 시작 화면이 아닙니다.
  • 포 그라운드가 잠겨 있지 않습니다 (LockSetForegroundWindow 참조).
  • 전경 잠금 시간 제한이 만료되었습니다 (SystemParametersInfo의 SPI_GETFOREGROUNDLOCKTIMEOUT 참조).
  • 메뉴가 활성화되어 있지 않습니다.

따라서 프로그램이 위와 일치하지 않으면 전경을 자동으로 설정할 수 없습니다.

귀하의 사례에 대해 아래 코드를 사용할 수 있다고 생각합니다.이 경우 link도 도움이 될 수 있습니다.

void SetForegroundWindowForce(HWND hWnd) 
{ 
    HWND hWndForeground = ::GetForegroundWindow(); 
    if(hWndForeground == hWnd) return; 

    DWORD Strange = ::GetWindowThreadProcessId(hWndForeground, NULL); 
    DWORD My = ::GetWindowThreadProcessId(hWnd, NULL); 
    if(!::AttachThreadInput(My, Strange, TRUE)) 
    { 
     ASSERT(0); 
    } 
    ::SetForegroundWindow(hWnd); 
    ::BringWindowToTop(hWnd); 
    if(!::AttachThreadInput(My, Strange, FALSE)) 
    { 
     ASSERT(0); 
    } 
} 
+0

감사합니다. 나는 그것을 시도하지는 않았지만 MSDN을 보면 내가 이해했다고 생각한다. 내 해석은 다음과 같습니다. 먼저 핸들을 전경 창과 코어 렌트 창에 유지합니다. AttachThreadInput()을 사용하면 프로세스가 입력 버퍼를 공유합니다 (그 점에 대해서는 확실하지 않습니다 ...). 다른 창을 위에 놓고 두 프로세스를 "분할"하는 것보다.
나는 그것에 대해 확실하지 않습니다, 뭔가 완전히 잘못되면 제게 지적 해주십시오, 고맙습니다 !! –

+0

당신은 거의 정확합니다. 'AttachThreadInput'을 사용하면 두 개의 다른 쓰레드가 키보드, 마우스 등과 같은 입력 상태를 공유 할 수 있습니다. 윈도우 핸들은 두 번째 매개 변수에 ** TRUE **를 지정하여 AttatchThreadInput 함수를 호출 할 때 ** 오른쪽 조건 **을 획득 할 수 있습니다. – hyun

+0

확인. 창 핸들로 그 방법을 실행합니다. AttachThreadInput은 0보다 큰 값을 반환하므로 if에있는 작업을 수행합니다 (매개 변수만으로 어설 션이 작동하는 방식을 알지 못합니다). 두 번째 창에 키 조합을 보내려면 어떻게해야합니까? 심지어 초점을 변경하지 않고. –

관련 문제