Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107

Приложение запускаемое всего один раз

10.04.2019, 14:18. Показов 1788. Ответов 12

Студворк — интернет-сервис помощи студентам
Приложение типа AIMP позволяет запустить его один раз, а при повторном запуске переключает фокус на уже имеющееся в памяти приложение.

Есть пример с использованием GIUD
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
 
namespace SingleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            bool existed;
            // получаем GIUD приложения
            string guid = Marshal.GetTypeLibGuidForAssembly(Assembly.GetExecutingAssembly()).ToString();
 
            Mutex mutexObj = new Mutex(true, guid, out existed);
 
            Console.WriteLine(guid);
 
            if (existed)
            {
                Console.WriteLine("Приложение работает");
            }
            else
            {
                Console.WriteLine("Приложение уже было запущено. И сейчас оно будет закрыто.");
                Thread.Sleep(3000);
                return;
            }
            Console.ReadLine();
        }
    }
}
который запрещает приложению повторный запуск...
Так же, можно сделать это же через парсинг имени текущего процесса. С последующим закрытием копии если имя найдено.

Но как переключить фокус первого из приложений, которое уже запущено?
Для тех, кто не понял задачи: Нужно чтобы окно процесса, запущенного первым активизировалось когда запускается копия этого процесса. Как передать ему параметры для активации формы?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2019, 14:18
Ответы с готовыми решениями:

Запускаемое приложение отключается
Есть у меня многопоточное приложение myApp.exe, которое также использует видеокарту. Я его запускаю из C# и хочу прочитать то, что оно...

Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот символ
Помогите с задачей на C# Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот...

Сколько всего раз была нажата кнопка
Здравствуйте! У меня следующий вопрос. Мне необходимо посчитать сколько всего раз была нажата кнопка за весь цикл программы. Понятно, что...

12
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.04.2019, 14:28
Лучший ответ Сообщение было отмечено Zeropil как решение

Решение

Цитата Сообщение от Zeropil Посмотреть сообщение
Как передать ему параметры для активации формы?
Запуск одной копии программы (exe файла)
1
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
10.04.2019, 16:56  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Запуск одной копии программы (exe файла)
100% в мишень, спасибо!
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
11.04.2019, 16:53  [ТС]
Использовал пример, но увы, дальше этой строки действие не заходит
C#
1
2
3
4
static void ActivateRunningInstance()
        {
            Win32.PostMessage(Win32.HWND_BROADCAST, Win32.WM_MAINFORM_ACTIVATE,IntPtr.Zero, IntPtr.Zero);
        }
Изначально в примере используется переменная типа int и на 2 параметре компилятор ругается на тип данных, заменил в функции тип на uint
C#
1
2
[DllImport("user32.dll")]
        public static extern bool PostMessage(IntPtr hwnd, uint msg, IntPtr wparam, IntPtr lparam);
Однако, в главном окне нет сообщения (то-есть, сообщение отправляется в никуда или не отправляется/не принимается совсем).

C#
1
2
if (m.Msg == Win32.WM_MAINFORM_ACTIVATE)
                RestoreAndActivate();
Для проверки скомпилировал программу и запустил с диска, однако, при запуске копии она просто закрывается. Пробовал запускать копию через отладчик, код выполняется до функции
C#
1
ActivateRunningInstance
и приложение закрывается.

Пробовал запустить в отладчике, а потом запустил скомпилированную заранее копию, нет реакции. Видимо не работают API функции, система вин 10, работаю от имени администратора.

Добавлено через 27 минут
Решение нашел тут
https://www.cyberforum.ru/csha... 19952.html

Добавляем ссылку
C#
1
2
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
изменяем процедуру на эту

C#
1
2
3
4
5
6
static void ActivateRunningInstance()
        {
            IntPtr i = FindWindowByCaption(IntPtr.Zero, "FormName");//Нужно указать заголовок окна программы, он должен быть статичным!
 
            Win32.PostMessage(/*Win32.HWND_BROADCAST*/i, Win32.WM_MAINFORM_ACTIVATE,IntPtr.Zero, IntPtr.Zero);
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.04.2019, 17:42
Цитата Сообщение от Zeropil Посмотреть сообщение
сообщение отправляется в никуда или не отправляется/не принимается совсем
Метод PostMessage возвращает значение.
Если оно false, то произошла ошибка.
Немного измените атрибут метода:
C#
1
2
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hwnd, uint msg, IntPtr wparam, IntPtr lparam);
И точку вызова:
C#
1
2
3
4
5
6
7
        static void ActivateRunningInstance()
        {
            if (!Win32.PostMessage(Win32.HWND_BROADCAST, Win32.WM_MAINFORM_ACTIVATE, IntPtr.Zero, IntPtr.Zero))
            {
               int error = Marshal.GetLastWin32Error();
            }
        }
Сюда можете выложить значение error.
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
11.04.2019, 21:31  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Сюда можете выложить значение error.
Действия ограничиваются скобками
C#
1
2
3
        static void ActivateRunningInstance()
        {
        }
процедура Win32.PostMessage возвращает false.

Если я правильно понял, то проблема в том, что моя форма имеет другое значение IntPtr Потому процедура обращается к иной форме.

Предыдущий пост - работает без проблем.

процедура
C#
1
IntPtr i = FindWindowByCaption(IntPtr.Zero, "FormName");
возвращает0x003c06ea

не знаю, может это важно, вот код из конструктора формы FormName.Designer.cs

C#
1
2
3
4
5
6
7
8
9
            this.Cursor = System.Windows.Forms.Cursors.SizeAll;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.Name = "FormName";
            this.Opacity = 0D;
            this.ShowInTaskbar = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "FormName";
это свойства заданы уже в самой форме
C#
1
2
3
4
5
6
7
8
9
10
11
public FormName()
          {
            InitializeComponent();
 
            this.Opacity = 0.0;
            this.FormBorderStyle = FormBorderStyle.None;
            this.AllowTransparency = true;
            this.BackColor = Color.White;//AliceBlue;//цвет фона  
            this.TransparencyKey = this.BackColor;//он же будет заменен на прозрачный цвет  
            //... 
           }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.04.2019, 22:43
Zeropil, так что в error-то лежит?
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
12.04.2019, 10:37  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
так что в error-то лежит?
Не могу знать, процедура Win32.PostMessage выполняется, а вот ответ из скобок я не получаю.

Добавлено через 1 минуту
иными словами код не выполняется
Цитата Сообщение от kolorotur Посмотреть сообщение
int error = Marshal.GetLastWin32Error();
Добавлено через 9 минут
У меня, встречный вопрос, в процедуру
C#
1
Win32.PostMessage
мы должны первым параметром отправить IntPtr формы, о чем говорит комментарий.

Однако, вместо этого мы (по вашему коду) отправляем "константу"
C#
1
2
3
4
5
 
        /// <summary>
        /// Дескриптор окна, которому отправляется сообщение. Данное значение отсылает сообщение всем окнам.
        /// </summary>
        public static readonly IntPtr HWND_BROADCAST = new IntPtr(0xFFFF);
Хотя, в том же комментарии написано, что это должен быть дескриптор окна. Может ошибка в этом?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.04.2019, 09:43
Цитата Сообщение от Zeropil Посмотреть сообщение
ответ из скобок я не получаю.
В смысле не получаете?
Подразумевалось, что вы поставите там точку остановки и посмотрите значение переменной error в отладчике.

Цитата Сообщение от Zeropil Посмотреть сообщение
У меня, встречный вопрос, в процедуру Win32.PostMessage мы должны первым параметром отправить IntPtr формы, о чем говорит комментарий. Однако, вместо этого мы (по вашему коду) отправляем "константу"[...] Может ошибка в этом?
Нет, наличие слова BROADCAST в названии константы как бы намекает, что это сообщение отправляется всем окнам
Суть в том, что сообщение отсылается всем, а обрабатывает его только ваша программа, т.к. она его зарегистрировала и знает что это за сообщение. Остальные его проигнорируют.

Скорее всего у вас не работает потому, что в вин10 стоят какие-то ограничения на отправку сообщений всем окнам.
На семерке это работает прекрасно, потому и хотелось глянуть на код ошибки, возвращаемый методом GetLastWin32Error.
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
14.04.2019, 10:05  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В смысле не получаете?
Подразумевалось, что вы поставите там точку остановки и посмотрите значение переменной error в отладчике.
А как я тогда определил без точки входа в режиме отладки что процедура if обходится и вложенный в нее код игнорируется?

Пробовал изменять условие, убрав оператор НЕ в этом случае код 0x00000. В 10 версии API вообще странно работает, написал код для восстановления раскладки клавиатуры, а он (код), несмотря на много численные примеры в сети, игнорируется полноэкранными приложениями. Как бы, в системе параметр изменяется, а вот приложения игнорируют.

Нужно писать библиотеку для новых(рабочих) API под х64 архитектуру.

Добавлено через 5 минут
Кстати, в 10 версии есть такой параметр в диспетчере как Виртуализация UAK и, я так понимаю "хомяки и тут порылись". Процессы и без того в изолированной среде работают, словно каждый в своем домене, так их еще можно и в изолированную среду перенести.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.04.2019, 10:33
Цитата Сообщение от Zeropil Посмотреть сообщение
А как я тогда определил без точки входа в режиме отладки что процедура if обходится и вложенный в нее код игнорируется?
Не воспринимайте лично, но зачастую народ просто копирует код и ожидает, что какое-то сообщение вылетит.

Цитата Сообщение от Zeropil Посмотреть сообщение
Пробовал изменять условие, убрав оператор НЕ в этом случае код 0x00000.
Что странно.
Это означает, что сообщение успешно улетает, но почему-то не приходит другим окнам.
Доберусь до десятки — проверю.

А второй вариант из той темы не пробовали? Он как-то проще в реализации.
Есть еще один вариант реализации — через именованные каналы.
0
16 / 0 / 0
Регистрация: 23.02.2019
Сообщений: 107
14.04.2019, 13:02  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Не воспринимайте лично
Меня насторожило то, что переменной
C#
1
int error =
значение присвоено, но оно ни куда не выводится.
К частью, отладчиком пользуюсь давно (выручает при просмотре свойств массивов), потому посмотрел "работает ли" метод. Но, будь я тем, кто не разбирается в программировании просто сделал бы 2 действия ctrl+c, ctrl+v. Так что в этом вопросе солидарен с вами.

Поставить пробную версию на 30 дней не сложно, качаем с официального сайта mediacreationtool в настройках выбираем (iso, dvd, ...) и качаем образ.
На пустой диск на среднем железе система ставится за ~10 минут + настройки, которые делает система под параметры железа (еще около 15 минут, зависит от быстродействия железа) + поиск и установка всех возможных драйверов, обновлений.
Если образ есть можно скачать VM BOX и развернуть систему в нем. Тогда время установки сократится.

Добавлено через 8 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
А второй вариант из той темы не пробовали?
Нет, не пробовал. Я сейчас пытаюсь изучить все, связанное с потоками, пример на Mutex был как раз к стати. Когда заработал пример с поиском окна, я остановился на рабочей версии проекта. К тому же, в моем проекте окно не сворачивается и не закрывается, а тут все необходимые условия для его активации выполнены.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.04.2019, 14:09
Цитата Сообщение от Zeropil Посмотреть сообщение
Поставить пробную версию на 30 дней не сложно
Да у меня на домашнем десятка стоит
А на рабочем — семерка, потому до вечера не проверить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2019, 14:09
Помогаю со студенческими работами здесь

Запускаемое Android-приложение
для того чтобы андроид проект можно было запустить на телефоне у него обязательно должен быть прописан главный пусковой элемент в манифесте...

Таймер срабатывает всего один раз
Блок должен сдвигаться на 10px вниз каждую секунду. Всё срабатывает один раз и замирает. Что необходимо добавить ? time (); function...

Вывод значения из mysql всего один раз
Есть цикл: $result = @mysql_query(&quot;SELECT city FROM $textable WHERE link= ''$link''&quot;); while ($myrow=@mysql_fetch_array($result))...

Проходит вложенный цикл for всего один раз
Здравствуйте. Что-то немного запарился с вложенными циклами, как сделать их правильно? Есть 3 List и переменная ...

istringstream должен работать всего один раз?
Вот простейший код. Кто-нибудь может объяснить почему переменная b здесь остаётся равной нулю? #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru