2011-02-24 3 views
2
[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect); 

[StructLayout(LayoutKind.Sequential)] 
public struct RECT 
{ 
    public int Left;  // x position of upper-left corner 
    public int Top;   // y position of upper-left corner 
    public int Right;  // x position of lower-right corner 
    public int Bottom;  // y position of lower-right corner 
} 

foreach (Process pr in Process.GetProcesses()) 
{ 
    RECT rc; 
    GetWindowRect(???, out rc); 

"???"으로 무엇을 넣어야합니까? . 그것은 HandleRef 객체를 넣어야한다는 것을 말해 주지만 Process 메소드에서 HandleRef 객체를 얻는 방법을 모른다.C# - user32.dll - GetWindowRect 문제

+1

당신은 단계를 생략했습니다; 먼저 창에서 네이티브 핸들을 가져와야합니다. 예를 들어, 윈도우가 애플리케이션의 C# 메인 폼 (WinForms 앱을 가정 할 때)이라면 새로운'HandleRef (this, this.Handle); '를 사용할 것입니다. 먼저 해당 윈도우에 대한 핸들을 얻어야합니다. .Handle은 그렇지 않을 가능성이 있습니다.) –

답변

0

프로세스 핸들은 필요 없지만 창의 핸들입니다. 당신이 열거 프로세스를 필요로하지 않는 창 핸들을 얻을 수있는 다른 방법이 있습니다, 윈도우가 프로세스에 이미 윈도우 좌표가 필요한 경우

당신은 PInvoke를 http://pinvoke.net/default.aspx/user32/GetWindowRect.html

+0

나는 모든 프로세스가 내 응용 프로그램 만 처리하는 것은 아 니라. – xoromer

+1

@Sergey : 해당 문서를 읽으면 여기에 해당되지 않는다는 것을 알게 될 것입니다. 프로세스 핸들이 아니라 창 핸들입니다. –

+0

귀하의 링크는 OP (누가 이미 그것을 발견했는지)에 도움이되지 않습니다. 응용 프로그램 내에서 양식의 창 핸들을 가져 오는 방법 만 보여줍니다. 그것이 유스 케이스라면 GetWindowRect를 전혀 사용할 필요가 없습니다. .NET 양식은 이미 그 정보를 제공 할 수 있습니다. -1 –

10

에 몇 가지 예제를 사용할 수 있습니다.

WinForms 창의 경우 Handle 속성을 사용하십시오.

WPF 응용 프로그램의

System.Windows.Forms.Control ... Handle Property @ MSDN

, 당신은 당신이 .NET에서 직접 액세스 할 수 없습니다 창을 열거하려는 경우 WindowInteropHelper

System.Windows.Interop ... WindowInteropHelper Class @ MSDN

를 사용; 코드의 범위를 벗어나는 최상위 창을 만드는 타사 컨트롤에서 win32 EnumWindows 함수를 통해 열거 할 수 있습니다. P에 대한

EnumWindows (Win32) @ MSDN

서명은/EnumWindows에 대한 호출이 여기에 사용할 수 있습니다

User32.dll EnumWindows @ pinvoke.net

추가 : 당신은 모든 창문 & 관련된 프로세스를 열거 할 같은

보인다. EnumWindows을 사용한 다음 GetWindowThreadProcessId을 호출하여 각 프로세스에 대해 & 관리되지 않는 스레드 ID를 가져옵니다.

GetWindowThreadProcessId (Win32) @ MSDN

P/서명이 여기에 있습니다 호출 :

User32.dll GetWindowThreadProcessId @ pinvoke.net

마지막으로, 당신은 정적 메소드 GetProcessById를 통해 프로세스 개체를 얻을 수 있습니다.

Process.GetProcessById @ MSDN

추가 (# 2) :

여기 창, 공정 & 스레드 ID를 열거 할 수 짧은 콘솔 프로그램입니다. 스 니펫과는 몇 가지 차이점이 있습니다.

  1. 나는 HandleRef가 아니라 IntPtr을 사용합니다. 다른 사람들이 지적했듯이, 이것은 당신을 혼란스럽게 할 수 있습니다.
  2. return 특성을 지정하지 않았습니다. 필요한 경우 다시 추가 할 수 있습니다.
  3. 관리자로 실행 중입니다. 사용자 수준 권한으로 실행중인 경우 일부 기능이 다르게 실행될 수 있습니다. 작동 할 수 있습니다 새로운 HandleRef (홍보, pr.MainWindowHandle)를 사용하여

C# Source Code Example @ gist.github

+0

유일하게 유용한 답변 +1 –

+0

감사합니다! 하지만 나는 혼란스러워. 예, .NET에서 다른 프로세스의 윈도우 속성에 액세스 할 수없는 것 같습니다. – xoromer

+0

샘플 작업을 할 수있었습니다. 하지만 내 컴퓨터에서 관리자로 실행 중입니다. 소스 코드에 대한 링크를 게시하여 사용자 환경의 테스트 프로젝트에서 시도해 볼 수 있습니다. – meklarian

2

. 프로그램에 실제로 메인 윈도우가 있다고 가정합니다. 이 정보를 얻는 확실한 방법이 있습니다.

foreach 루프가 필요하지만 Process.GetCurrentProcess()에서 컴파일되지 않습니다. 모든 프로세스를 반복하려고하면 코드를 폭파 할 것이고 정보를 공유하는 것에 별 관심이없는 특권 시스템 프로세스를 얻을 수 있습니다. 왜 당신이 이것을하려고 하는지를 추측하는 것은 불가능합니다. EnumWindows를 사용하여 바탕 화면의 모든 최상위 창을 열거합니다.

+0

HandleRef (pr, pr.MainWindowHandle)가 작동하지 않습니다. Process.GetCurrentProcess()를 이용해 주셔서 감사합니다. 나는 그것을 고쳤다. – xoromer

+2

글쎄, GetWindowRect() 인수를 IntPtr로 변경하면 HandleRef는 불필요합니다. –

+0

Didnt work. . . . – xoromer

1

이 작동하지만 처음에 당신은 FindWindowEx 같은 WINAPI 함수를 사용하여 윈도우의를 IntPtr의 HWND를 찾을 필요가 :

[DllImport("user32.dll")] 
public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle); 

Rect r = new Rect(); 
GetWindowRect(hwnd, ref r);