2014-05-13 2 views
1

Я разрабатываю для Server 2003 с C# и .NET Framework 2.0GDI + Окно предупреждения Shutdown

Пока программа работает, я не могу выключение моей машины. Ничего не происходит, но когда alt + tabbing, я вижу окно под названием «GDI + Window». Как только я закрою свою программу, я могу закончить работу компьютера.

Однако на других моих компьютерах (Windows XP professional, windows 8, windows 8.1) этого не происходит.

Программа извлекает данные из базы данных и отправляет их в Интернет, поэтому у меня есть Thread, работающий в фоновом режиме. Может быть, это проблема?

код в главном классе является следующее:

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 + Window" за исключением Alt + Tab список, который не является открываемый

+1

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

+1

Я предлагаю пересмотреть, нужно ли отображать пользовательский интерфейс для программы, которая работает в фоновом режиме и извлекает информацию из базы данных и отправляет ее в Интернет. Если вы не создаете какой-либо пользовательский интерфейс, вы не будете инициализировать GDI +, и это окно не будет создано. –

+0

Я думал о пользовательском интерфейсе, но это важно, так как мне приходится часто менять некоторые данные, что намного удобнее, и я могу отображать структурированную информацию. Я вставил код примера из вашей ссылки, но получаю исключение TypeLoadException. Дополнительная информация: Тип «MyProject.Form1» из сборки «MyProject, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null» не может быть загружен, потому что метод «SetForegroundWindow» не имеет реализации (без RVA) , (свободно переведенный мной) – 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 был необработанным Сообщение: Необработанное исключение типа «System.TypeLoadException» произошло в mscorlib.dll
Дополнительная информация: Не удалось загрузить тип 'App.Form1' из сборки 'App, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null ', потому что метод SetForegroun dWindow 'не имеет реализации (нет RVA).

Это вызвано тем, что SetForegroundwindow не имеет атрибута [Dllimport]. Я могу воспроизвести это исключение, комментируя строку с помощью [Dllimport]. Без этого ваш код будет компилироваться, но поскольку метод SetForegroundWindow не будет реализовывать какую-либо реализацию, среда выполнения отказывается загружать ваш тип и, следовательно, исключение.

В техническом смысле RVA обозначает Относительный виртуальный адрес и является смещением к базовому модулю модуля. Поиск элементов RVA и добавление его в базовый адрес возвратит указатель начала (метод, данные и т. Д.). Если искать нечего, поскольку ничего не выполнить, модуль не может быть безопасно выполнен. См. 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

Я поддержал это, потому что в нем есть мое имя. –