2014-05-13 396 views
1

我正在開發用於C#和.NET Framework 2.0的Server 2003GDI +窗口阻止關機

只要程序運行,我就無法關閉我的機器。什麼也沒有發生,但是當alt + tabbing我可以看到一個叫做「GDI + Window」的窗口。只要我關閉程序,我就可以正常關閉電腦。

但是,在我的其他電腦上(Windows XP專業版,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 +窗口」中的Alt + Tab列表中,這是不打開的

+1

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

+1

我建議重新考慮是否需要顯示概括起來講,下面的代碼用於在後臺運行的程序的UI,並從數據庫中提取信息並將其發送到Internet。如果您不創建任何類型的用戶界面,則不會初始化GDI +,並且不會創建此窗口。 –

+0

我想到了用戶界面,但這很重要,因爲我必須經常更改一些數據,這樣更加方便,我可以顯示結構化的信息。我從你的鏈接插入了示例代碼,但是我得到了一個TypeLoadException。其他信息:由於方法「SetForegroundWindow」沒有實現(無RVA),因此無法加載程序集「MyProject,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null」中的類型「MyProject.Form1」 。 (由我自由翻譯) – HigHendHd

回答

1

Cody Gray所示,當GDI +子系統初始化並保持前景窗口時存在已知條件。在KB article 943453提供的解決方案是明確設置前臺窗口,一旦您的主要形式加載,就像這樣:

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); 
    } 
} 

在評論你要求你試過,但都面臨着typeload例外:

System.TypeLoadException未處理 消息:在mscorlib.dll中發生類型'System.TypeLoadException'的未處理異常
其他信息:無法從程序集'App,版本= 1.0.0.0,文件中加載類型'App.Form1' =中立,PublicKeyToken = null',因爲方法'SetForegroun dWindow'沒有實現(沒有RVA)。

這是由於SetForegroundwindow沒有應用[Dllimport]屬性而引起的。我可以通過評論[Dllimport]這一行來重新表示異常。沒有你的代碼將編譯,但因爲方法SetForegroundWindow將不會有任何實現運行時拒絕加載您的類型,因此是例外。

從技術意義上說,RVA代表相對虛擬地址,它是模塊基址的偏移量。查找項目RVA並將其添加到baseaddress將返回項目(方法,數據等)的開始指針。如果由於沒有任何東西需要執行而無法查找,則無法安全執行該模塊。有關更多背景信息,請參閱https://msdn.microsoft.com/en-us/library/ms809762.aspx

所謂

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

時將執行this unmanaged method in the WinAPI

+2

我提高了這個,因爲它裏面有我的名字。 –