2014-05-13 1 views
1

C# 및 .NET Framework 2.0을 사용하는 Server 2003 용으로 개발 중임GDI + 종료를 막는 창

프로그램이 실행되는 동안 컴퓨터를 종료 할 수 없습니다. 아무 일도 일어나지 않지만 alt + tabbing을하면 "GDI + Window"라는 창이 보입니다. 프로그램을 종료하자마자 컴퓨터를 올바르게 종료 할 수 있습니다.

그러나 다른 컴퓨터 (Windows XP Professional, Windows 8, Windows 8.1)에서는 발생하지 않습니다.

프로그램은 데이터베이스에서 데이터를 가져 와서 인터넷으로 전송하므로 백그라운드에서 실행중인 스레드가 있습니다. 그게 문제가 될 수 있습니까? 물론

public partial class Form1 : Form 
{ 
    bool run = true; 
    //AutoStart autoS = new AutoStart(); 
    int interval; 
    //LogFileBuilder lfboom = new LogFileBuilder(true);*/ 

    public Form1() 
    { 
     InitializeComponent(); 
     /*OpenOnce(); 
     //autoS.EintragHinzufügen(); 
     WriteMe(); 
     LogFileBuilder lfb = new LogFileBuilder(); 
     lfb.writeLine("Programm gestartet"); 
     new Thread(Durchführung).Start();*/ 
    } 
} 

이 형태의 다른 방법과 이벤트 핸들러는하지만, 호출되지 않기 때문에 그들은 관련이없는 때이 문제를 재현 :

메인 클래스의 코드는이 다음이다 . 보시다시피 InitializeComponents()를 제외하고 내 전체 코드를 주석 처리했지만 여전히 문제가 발생합니다. 재생을위한

단계 :
1. 프로그램 개방하지
2. 종료
3. 아무것도 알트 + 탭 목록에 새로운 "GDI + 창"을 제외하고 발생하지 않는 서버,

+1

http://support.microsoft.com/kb/943453 –

+1

실행됩니다

[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); 

라고 그래서

다음 코드를 정리해하기 백그라운드에서 실행되고 데이터베이스에서 정보를 가져 와서 인터넷에 보내는 프로그램을위한 UI입니다. 어떤 종류의 UI도 만들지 않으면 GDI +를 초기화하지 않고이 창을 만들지 않습니다. –

+0

UI에 대해 생각해 보았습니다. 그러나 데이터를 자주 변경해야하므로 매우 편리합니다. 정보를 구조화하여 표시 할 수 있기 때문에 중요합니다. 귀하의 링크에서 예제 코드를 삽입했지만 TypeLoadException이 발생합니다. 추가 정보 : "SetForegroundWindow"메서드에 구현 (RVA 없음)이 없으므로 어셈블리 "MyProject, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null"에서 "MyProject.Form1"유형을로드 할 수 없습니다. . (자유롭게 번역했습니다) – HigHendHd

답변

1

Cody Gray으로 표시된 것과 같이 GDI + 하위 시스템이 초기화 된 다음 전경 창이 유지되는 알려진 조건이 있습니다.

: 당신은 당신이 시도하지만 typeload 예외에 직면했다 주장하는 의견에

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    //using System.Runtime.InteropServices; 
    // tell the runtime to use the user32.dll for implementation of the next method 
    [DllImport("user32.dll")] 
    // what is returned by this method 
    [return: MarshalAs(UnmanagedType.Bool)] 
    // the methed to call in User32 
    // upper/lower case is important 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     SetForegroundWindow(this.Handle); 
    } 
} 

다음 KB article 943453에서 제공하는이 솔루션은 명시 적으로 한 번 자신의 메인 폼이로드를 전경 창 설정과 같이하는 것입니다

System.TypeLoadException 처리되지 않았습니다. 메시지 : mscorlib.dll에서 'System.TypeLoadException'형식의 처리되지 않은 예외가 발생했습니다.
추가 정보 : 어셈블리 'App, Version = 1.0.0.0, Culture에서'App.Form1 '형식을로드 할 수 없습니다. = 중립, PublicKeyToken = null '때문에 메서드'SetForegroun dWindow '에는 구현이 없습니다 (RVA 없음).

SetForegroundwindow에는 [Dllimport] 특성이 적용되지 않았기 때문입니다. [Dllimport]을 사용하여 해당 예외를 다시 작성할 수 있습니다. 코드가 없으면 코드가 컴파일되지만 메서드 SetForegroundWindow에 구현이 없으므로 런타임에서 유형을로드하지 않으므로 예외가 발생합니다.

기술적 인 의미에서 RVA는 의 상대 가상 주소을 나타내며 모듈의 기본 주소와 오프셋입니다. 항목 RVA를 찾고 baseaddress에 추가하면 항목 (메소드, 데이터 등) 시작 포인터가 반환됩니다. 조회 할 항목이 없으므로 실행할 항목이 없으므로 모듈을 안전하게 실행할 수 없습니다. 배경을 더 보려면 https://msdn.microsoft.com/en-us/library/ms809762.aspx을 참조하십시오.난 당신이 표시해야하는지 여부를 재검토 제안 this unmanaged method in the WinAPI

+2

내 이름이 있기 때문에 나는 이것을 upvoted. –

관련 문제