Окно WPF из консольного проекта?
Недавно я начал проект C # (VS 2008) как проект «Консоль», в котором я написал несколько библиотек, тестовых программ и т. Д. Теперь я хотел бы добавить пару окон WPF, но похоже, что консольный проект не будет позволь мне сделать это. Я пришел с Java, так что это немного странно. Как я могу добавить форму WPF (которую я создам для себя из своего «основного» класса?
5 ответов
Вы уверены, что вам нужен консольный проект? Вы можете создать проект «Приложение WPF» и добавить ссылки на свои библиотеки и т. Д. Если вы попытаетесь показать окно WPF из консольного приложения, вы получите исключение из-за различий в модели потоковой передачи между консольными и WPF-приложениями.
Боюсь, что принятый ответ не совсем верен, просто добавьте атрибут [STAThread] перед основным методом и сделайте ссылки на нужные библиотеки (например, System.Windows), и все готово для добавления окон wpf.
РЕДАКТИРОВАТЬ: в комментариях @JamesWilkins предоставил мне эту полезную ссылку: http://code-phix.blogspot.be/2013/11/creating-wpf-project-from-scratch.html
У меня был такой же вопрос, и я искал аналогичный ответ. Я нашел информацию повсюду, поэтому я помещаю то, что нашел в одном месте. Мне также нужен был способ скрыть и показать окно консоли, поэтому я обнаружил, что это сработало (для VS 2013+):
Создайте новый консольный проект (обязательно выберите нужную версию .NET framework — мне нужно было использовать .Net 4.0). Убедитесь, что у вас есть следующие ссылки:
- Среда представления
- Ядро презентации
- WindowsBase
- System.xaml
Щелкните правой кнопкой мыши проект в проводнике решений, выберите «Свойства» и измените тип вывода проекта на «Приложение Windows». Это предотвращает отображение окна консоли при запуске (если вы хотите этого, пропустите этот шаг).
Хотя управление окном консоли не обязательно для добавления окон WPF, это может быть полезно. Если вам это не нужно, переходите к №4. В классе «Программа» для консоли добавьте это, чтобы управлять окном:
Это позволяет создавать, скрывать и отображать окно консоли. Для этого я создал следующие методы:
В большинстве случаев они не требуют пояснений, но если проект находится в оконном режиме, GetConsoleWindow(); возвращает null , поэтому здесь мы проверяем, является ли дескриптор нулевым (в данном случае — нулем), и если да, окно консоли необходимо создать (только один раз). После этого GetConsoleWindow(); всегда будет возвращать дескриптор для использования.
Как уже говорилось в другом ответе, вам необходимо добавить [STAThread] в строку перед методом Main вашей консоли. Это необходимо, поскольку WPF необходимо запускать в Однопоточная квартира.
Добавление окна: для этого просто добавьте пользовательский элемент управления в свой проект и назовите его «MainWindow» (или как хотите). Просто щелкните правой кнопкой мыши узел проекта в проводнике решений и выберите Add->User Control. . Откройте код MainWindow.xaml.cs и измените MainWindow : UserControl на MainWindow : Window . Затем откройте файл MainWindow.xaml и измените первый тег <UserControl на <Window (и убедитесь, что закрывающий тег также переименовывается, что должно быть автоматически при использовании Visual Studio). Закройте все вкладки редактора «MainWindow» и снова откройте (на всякий случай, возможно, в этом нет необходимости). Вы должны увидеть, что MainWindow.xaml теперь показывает окно в области дизайна.
Отображение окна WPF: для этого нам нужно запустить цикл оконных сообщений, что очень просто. Для начала я создал несколько свойств для хранения объектов. Просто поместите это где-нибудь в классе Program .
Затем мы должны создать цикл сообщений, создав объект System.Windows.Application , а затем передать его в главное окно. Я создал этот метод для выполнения этой задачи:
вот и все! Чтобы проверить это, поместите контент в главное окно и сделайте следующее:
Простое окно WinAPI Объектно-ориентированное
Я пытаюсь запустить простейшее окно объектно-ориентированным способом:
Я получаю сообщение об ошибке:
«Необработанное исключение в 0x013F1ADA в _WinApi.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000008».
А желтая стрелка указывает на определение обработчика m_hwnd.
Решение
Как писал Алан Стоукс, вы должны инициализировать указатель:
Другое дело, в функции:
вы создаете новую временную переменную:
и выделение памяти для него, а не вашей переменной-члена (m_hInstance). Пытаться:
Replacing WinMain() with main() function in Win32 programs
I searched a little bit on StackOverflow and Google but couldn’t get the idea. I want to start my application with this type of user programming:
But this isn’t possible because I should pass the hInstance and hPrevInstance and other parameters to a WinMain function. Actually there is a Window class which I designed to make the window creation a little bit easier. I saw this implementation on SFML but I don’t know how it did come to this.
Right now I’m using the usual way:
4 Answers 4
You can use standard main in a "windows" app (that is, a GUI subsystem Windows application) even with the Microsoft tools, if you add the following to the Microsoft linker options:
Note that this is not necessary for the GNU toolchain.
Still for the Microsoft tools you can alternatively add this to your main file:
GetModuleHandle(NULL) will give you hInstance . hPrevInstance is always NULL .
![]()
First, GetModuleHandle(0) provides the executable’s module handle, which is the same as the hInstance argument of WinMain .
With the GNU toolchaing (g++ compiler), the standard-conforming code is OK.
The Microsoft toolchain, however, only accepts the standard-conforming code by default for a console subsystem executable. To create a GUI subsystem executable with this non-conforming toolchain, using a standard main , you have to specify a Microsoft runtime library entry point that calls the standard main , namely mainCRTStartup . For a command line invocation that means…
As a practical matter, for working in the command line you can simply specify the entry point in the LINK environment variable:
Creating a similar standard-conforming setup for Visual Studio is perhaps not desirable, since some Visual Studio project types (mainly MFC) requires use of Microsoft’s non-standard WinMain or wWinMain .
C как использовать winapp вместо main
C как использовать winapp вместо main
Простой способ перейти от main к WinMain, а от командной строки грамотно получить список аргументов
#ifdef WIN32
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPreInst, LPSTR lpCmdLine, int nCmdShow )
#else
int main( int argc, char *argv[] )
#endif
LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
. . .
LocalFree( lpArgv );
int argc;
char** argv;
LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
argv = (char**)malloc( argc*sizeof(char*) );
int size, i = 0;
for( ; i < argc; ++i )
size = wcslen( lpArgv[i] ) + 1;
argv[i] = malloc( size );
wcstombs( argv[i], lpArgv[i], size );
>
LocalFree( lpArgv );
>
int i = 0;
for( ; i < argc; ++i )
free( argv[i] );
free( argv );
>
#if defined(WIN32) && defined(DEBUG)
#define MAIN_NEED_CLEAR_ARGV
#include <shellapi.h>
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPreInst, LPSTR lpCmdLine, int nCmdShow )
int argc;
char** argv;
LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
argv = (char**)malloc( argc*sizeof(char*) );
int size, i = 0;
for( ; i < argc; ++i )
size = wcslen( lpArgv[i] ) + 1;
argv[i] = malloc( size );
wcstombs( argv[i], lpArgv[i], size );
>
LocalFree( lpArgv );
>
#else
int main( int argc, char *argv[] )
#endif
#ifdef MAIN_NEED_CLEAR_ARGV
int i = 0;
for( ; i < argc; ++i )
free( argv[i] );
free( argv );
>
#endif
Точка входа отличная от main/WinMain
Ошибка: In function main: 18 undefined reference to WinMain
Создайте класс, содержащий 2 закрытые переменные (катеты прямоугольного треугольника) и открытые.
Настройка размера окна при открытии программы (main(), не WinMain()
Доброго времени суток, форумчане! Во первых, хочу вас всех поблагодарить за помощь, благодаря.
Не могу запустить WPF проект. Не найдена точка входа Main. Ничего не понимаю.
Создал проект WPF. Удалил MainWindow.xaml, MainWindow.xaml.cs, App.xaml, App.xaml.cs. Потом такие.