2012-04-30 2 views
1

Windows API에서 GetWindowRect를 사용하여 실행중인 응용 프로그램의 경계를 얻으려는 경우이 경계를 사용하여 응용 프로그램을 캡처합니다.GetWindowRect는 한 응용 프로그램에서 잘못된 값을 반환하고 다른 모든 응용 프로그램은 올바른 것입니다.

내 코드는 테스트 한 약 10 개의 프로그램, notepad.exe 및 몇 가지 다른 프로그램에서 작동하지만 한 응용 프로그램에서 RocLink800과 함께 사용하려면 응용 프로그램 위치에 관계없이 잘못된 값을 반환합니다.

코드는 successs을 나타내는 하나의 에러 값을 반환 roclink800로 이제 C# .NET을

[StructLayout(LayoutKind.Sequential)] 
    public struct RECT 
    { 
     public int X; 
     public int Y; 
     public int Width; 
     public int Height; 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect); 

    IntPtr error = GetWindowRect(proc.MainWindowHandle, ref rect); 

    ... main code 
    while (error == (IntPtr)0) 
    { 
     error = GetWindowRect(proc.MainWindowHandle, ref rect); 
    } 

    int width = rect.right - rect.left; 
    int height = rect.bottom - rect.top; 

이 정확한 폭과 높이를 반환하는 모든 응용 프로그램이지만 응용 프로그램의 위치에 관계없이 다음과 같은 값을 반환합니다 :

rect.right = 960 rect.left = 960 rect.bottom = 600 rect.top = 600

나는이 왜 완전히 난처한 상황에 빠진입니다 무슨 일이 일어나면 Windows API (user32.dll)에서 화면 좌표를 얻는 방법이 있습니까? 그렇다면 roclink800은 windows95에서 포팅 된 오래된 프로그램입니다. 아마도 이상한 API를 사용하고있을 것입니다.

나는 응용 프로그램이 전체 화면으로 이동하게하고 화면을 이런 식으로 포착 할 수 있다고 생각하지만 덜 우아합니다.

아이디어 누구?

편집 :

 Process roclink = new Process(); 
     roclink.StartInfo.FileName = "C:/Program Files (x86)/ROCLINK800/Roclink.exe"; 
     //roclink.StartInfo.FileName = "notepad.exe"; 
     roclink.Start(); 
     IntPtr error = GetWindowRect(roclink.MainWindowHandle, ref rect); 

또는

 try 
     { 
      proc = Process.GetProcessesByName("roclink")[0]; 
     } 
     catch (IndexOutOfRangeException e) 
     { 
      return null; 
     } 

코드의 두 덩어리

이 같은 IntPtr입니다 반환하고 둘 다 내가 전화를하는 경우에는 960960600600를 돌려 핸들을 얻기를위한 내 코드

int error = SetWindowPos(roclink.MainWindowHandle, HWND_TOPMOST, 0, 0, 25,50, SWP_SHOWWINDOW); 

그렇다면 반환 된 좌표가 0,0,25,50이지만 응용 프로그램 크기는 c가 아닙니다. 한지.

roclink를 닫고 SetWindowPos 및 GetWindowRect를 닫는 중 프로그램을 중단하려고 시도했으나 핸들이 모두 올바른 핸들임을 나타내는 false 값을 반환하지 않습니다.

그래서이 응용 프로그램은 windowsize를 설정할 수 없거나 windowsAPI를 통해 얻을 수없는 것처럼 보입니다. 그 이유는 무엇일까요?

roclink.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; 

이 또한 무시되고 응용 프로그램이 전체 화면에 열리지 않습니다, 단순히 크기는 그것이 마지막에 열린

편집 :. 내가 가지고 올 수있는 유일한 해결책은 roclink의 복사본을 만드는 것입니다 .exe 그리고 손으로 전체 화면을 수동으로 열어서 닫으십시오. 아무도이 파일을 열지 않으면 항상 전체 화면이 열리 며, 이것은 dodgy이며 나는 그것을 좋아하지 않습니다. 아무도 아이디어가 없으면 왜 그런지 모르겠습니다. 같이가. :

답변

4

응용 프로그램의 경우 MainWindowHandle이 응용 프로그램이 시작되는 실제 '기본 창'이 아니라는 것이 분명하다고 생각합니다.

+0

와우 정말 어떤 이유로 나는 통해 핸들을 얻고 0이 아닌 값을 얻고 있었다,이 간단 "roclink"는 내가 성공적으로 핸들을 얻고 있다고 생각하게 만들고, null 값을 리턴하지만 "roclink"가 아닌 이상한 방법으로 프로세스를 통해 앱을 시작하고 process.MainWindowHandle을 사용하여 애플리케이션을 시작했습니다. 성공적으로 감사! – rolls

+0

이제는 무작위로 작동하고 무작위로 올바른 좌표를 제공 한 다음 960960600600 번 다시 부여하는 것 사이에서 번갈아 가며 작동하지 않습니다. 누구나 왜 내 손잡이가 오른쪽 좌표를 1/10 배로 줄 것이고 그런 다음 나머지는이 쓰레기를 남길 것입니다. – rolls

+0

SetWindowPos (roclink.MainWindowHandle, HWND_TOPMOST, 0, 0, 25,50, SWP_SHOWWINDOW)를 보내면 더욱 기괴합니다. 0,0,25,50의 좌표를 돌려 주지만, 어플리케이션은 실제로 좌표를 변경하지 않습니다. 아마도 이것은 잘못된 핸들이라는 점에 대한 믿음을 주는데 아마도 더 좋은 질문은 잘못된 핸들을 돌려주는 이유 일 것입니다. 코드를 가져 오는 핸들을 사용하여 내 질문을 업데이트합니다. – rolls

4

이 RockLink800 응용 프로그램의 스크린 샷을 보면 Delphi 응용 프로그램 인 것처럼 보이며 Delphi의 이전 버전에는 Application.Handle 인 숨겨진 창이있었습니다. 여기

는 SO 기존 델파이 응용 프로그램의 메인 윈도우 핸들을 얻는 방법을 대답한다 :

Retrieving Delphi Window Handles

+0

감사합니다. 이것은 왜 윈도우 핸들을 찾는 데 문제가 있었는지를 설명합니다. 올바른 핸들을 찾기 위해 로템의 조언을 사용했습니다. – rolls

관련 문제