Люди,
Пожалуйста, кто-нибудь знает, как показать форму из невидимого приложения, и получить ли она фокус (т.е. появиться поверх других окон)? Я работаю в С#.NET 3.5.
Я подозреваю, что принял "совершенно неправильный подход"... Я делаю не Application.Run(новый TheForm()) вместо этого я (новый TheForm()). ShowModal()... Форма - это в основном модальный диалог, с несколькими флажками; текстовое поле и кнопки "ОК" и "Отмена". Пользователь указывает флажок и вводит в описание (или что-то другое), затем нажимает OK, форма исчезает, и процесс считывает пользовательский ввод из формы, удаляет ее и продолжает обрабатывать.
Это работает, за исключением случаев, когда форма показывает, что она не получает фокус, вместо этого она появляется за приложением "хост", пока вы не нажмете на нее в панели задач (или что-то еще). Это наиболее неприятное поведение, которое, как я предсказываю, вызовет многие "вызовы поддержки", и существующая версия VB6 не имеет этой проблемы, поэтому я возвращаюсь в удобство использования... и пользователи не согласятся с этим (и и не должны).
Итак... Я начинаю думать, что мне нужно переосмыслить весь shebang... Я должен показать форму спереди, как "обычное приложение" и приложить оставшуюся часть обработки к кнопке OK, щелкните событие. Он должен работать, но для этого потребуется время, которое у меня нет (я уже со временем/бюджет)... так что сначала мне действительно нужно попытаться заставить текущий подход работать... даже быстрыми темпами, грязные методы.
Итак, пожалуйста, кто-нибудь знает, как "заставить" форму .NET 3.5 (справедливыми средствами или птицей), чтобы получить фокус? Я думаю, что "волшебные" вызовы API Windows (я знаю
Сумеречная зона: Это только кажется проблемой на работе, я использую Visual Studio 2008 в Windows XP SP3... Я просто не смог воспроизвести проблему с SSCCE (см. ниже) дома на Visual С# 2008 в Vista Ulimate... Это отлично работает. А? WTF?
Кроме того, я бы поклялся, что вчера на работе я показал форму, когда я запускал EXE, но не тогда, когда F5'ed (или Ctrl-F5'ed) прямо из среды IDE (которую я просто смирился). У дома форма отлично выглядит в любом случае. Полное опознавание!
Это может быть или не быть релевантным, но Visual Studio разбился и сжег сегодня утром, когда проект работал в режиме отладки и редактировал код "на лету"... он застрял, что я считал бесконечным цикл сообщений об ошибках. Сообщение об ошибке было чем-то вроде "не может отлаживать этот проект, потому что это не текущий проект или что-то еще... Поэтому я просто убил его с помощью проводника процессов. Он снова начал работать нормально и даже предложил восстановить" потерянный "" файл, предложение, которое я принял.
using System;
using System.Windows.Forms;
namespace ShowFormOnTop {
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Form1 frm = new Form1();
frm.ShowDialog();
}
}
}
Фон: Я переношу существующую реализацию VB6 на .NET... Это "плагин" для "клиентского" ГИС-приложения, называемого MapInfo. Существующий клиент "работал невидимо", и мои инструкции "сохранить новую версию как можно ближе к старой версии", которая работает достаточно хорошо (после нескольких лет исправления); он просто написан на неподдерживаемом языке, поэтому нам нужно его портировать.
Обо мне: Я вообще-то вроде noob для С# и .NET вообще, хотя у меня есть сертификат об удалении днища, я был профессиональным программистом в течение 10 лет; Поэтому я вроде как "знаю кое-что".
Любые идеи были бы наиболее желанными... и Спасибо всем, что нашли время, чтобы прочитать это далеко. Совесть не является (по-видимому) моей сильной стороной.
Приветствия. Кит.