2014-08-30 2 views
1

백그라운드에서 실행되는 프로그램이 있습니다. 메시지 상자가 나타나면 예를 클릭하여 지정된 프로그램으로 전환합니다.SetForegroundWindow가 작동하지 않습니다. 클래스/캡션 이름을 확인하는 방법

ClassName과 CaptionName이 작동하는 것을 찾지 못했습니다. 게임 World of Warcraft와 함께 작동해야합니다.

Window Title은 "World of Warcraft Retail"이라는 작업 관리자의 "Wold of Warcraft"입니다. Wow-64 속성의 "Wow-64"속성을 검사하면 제품 이름이 "World of Warcraft Retail"입니다. 워크 래프트 "그래서 나는이 모든 조합을 시도하고 아무것도 작동합니다. 코드를 넣으면 작동합니다.
BringToFront ("Notepad", "Untitled - Notepad");

작동하므로 와우에 적용하려면 무엇이 필요한지 잘 모릅니다.

내 코드는 다음과 같습니다

[DllImport("User32.dll")] 
    public static extern Int32 SetForegroundWindow(int hWnd); 
    [DllImport("user32.dll")] 
    public static extern int FindWindow(string lpClassName, string lpWindowName); 

    private void BringToFront(string className, string CaptionName) 
    { 
     SetForegroundWindow(FindWindow(className, CaptionName)); 
    } 

    private void Alert() 
    {   
     string title = "WoW Queue Alert: Message"; 
     string message = "The Queue is ready to accept!"; 
     MessageBoxButtons buttons = MessageBoxButtons.YesNo; 
     DialogResult result; 

     result = MessageBox.Show(new Form() { TopMost = true }, message, title, buttons, MessageBoxIcon.Information); 
     if (result == System.Windows.Forms.DialogResult.Yes) 
     { 
     BringToFront("World of Warcraft Retail", "World of Warcraft"); 
     } 
    } 

정말 와우에 대한 특별한 아무것도 표시되지 않으며, 메모장 예제는 올바른 코드를 작동하는 방법으로 진행이되어야합니다 :

  BringToFront("World of Warcraft Retail", "World of Warcraft"); 

가 전체 화면 인 프로그램에 영향을 미쳐야하고 어쨌든 블리자드가이 기능을 중지시키기 위해 뭔가를 구현 한 것을 볼 수 없습니다.

편집 : 방금 캡션 이름이 창 제목이기 때문에 ClassName을 null로 설정하고 작동합니다. ClassName이 무엇인지 알지 못해서 찾을 수있는 모든 것을 시도했습니다.

+0

'FindWindow'가 반환하는 것은 무엇입니까? – DavidG

+0

winapi 기능을 pinvoke 할 때 오류 검사는 * 선택 사항이 아닙니다. 당신은 친절하지 않습니다.NET 예외를 사용하면 더 이상 문제를 해결할 수 없으므로 직접 제기해야합니다. –

답변

0

일부 검사 도구를 사용하여 World of Warcraft의 창을 검사하여 Class NameWindow Name을 얻어야합니다. Visual Studio를 설치하면 제안 내용이 Spy++이됩니다 (함께 제공됨). 그것은 당신이 윈도우의 Class NameWindow Name을 감지하고 윈도우 메시지를 쉽게 찾을 수 있도록 도와줍니다.

예를 들어, 아래 그림은 현재 환경의 모든 창을 보여줍니다. 강조 표시된 항목은 Caption = "Microsoft PowerPoint"및 ClassName = "PPTFrameClass"인 PowerPoint 인스턴스입니다.

spy++

또 다른 방법은이의 WinForm을 "항상 비활성화"하고 원하는 윈도우의 창 핸들을 얻기 위해 그 양식에서 GetForegroundWindow 전화를 작성합니다.

단순히 무시, 그 CreateParams 특성에 "항상 비활성화합니다"의 WinForm을 만들려면 :를 클릭하여이 문제를 무시함으로써

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams p = base.CreateParams; 

     p.ExStyle |= 0x8000000; // WS_EX_NOACTIVATE - requires Win 2000 or higher 

     return p; 
    } 
} 

를 양식 심지어 마우스 을 집중되지 않습니다. 따라서 GetForegroundWindow()을 트리거하는 버튼을 만들 수 있습니다. C#의 함수 서명은 다음과 같습니다.

[DllImport("user32.dll")] 
public static extern IntPtr GetForegroundWindow(); 

현재 Foreground Window의 창 핸들을 반환합니다.

+0

spy ++가없는 Visual Studio Express를 사용하고 있습니다.이 파일은 http://web.archive.org/web/20090916053057/http://www.windows-spy.com/에 다운로드되었습니다. 모든 Spy ++가 외부 프로그램으로 수행하지만 클래스/캡션 이름으로 표시된 정보에서 아무 것도 볼 수 없습니다. – bob

+0

스파이 ++의 스크린 샷을 포함하도록 내 게시물을 편집했습니다.이 같은 것을 보았습니까? – nevets

+0

나는 당신이 제공 한 링크를 살펴 보았고 응용 프로그램이 "Windows list"에서 Class-Caption 쌍을 제공하는 것 같습니다. 창 목록 아래에서 모든 항목은 다음과 같이 표시됩니다. Handle-ClassName-CaptionName – nevets