Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384

Запрет запуска 5 экземпляра приложения

12.02.2018, 16:30. Показов 1054. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, сделал всё, как надо. Только не могу понять, почему между окнами есть небольшие расстояния.
Может, знает, кто-нибудь, в чём причина?
Окно первого экземпляра приложения расположить в левом верхнем, второго в правом верхнем, третьего - в левом нижнем, четвёртого
в правом нижнем углу экрана. Причём все окна равных размеров и занимют весь экран. В заголовке указать номер экземпляра. Запретить
запуск пятого экземпляра

листинг
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "stdafx.h"
#include <Windows.h>
 
LPCTSTR lpszClassName = L"MainClass";
 
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK MainProc(HWND, UINT, WPARAM, LPARAM);
 
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND hWnd = NULL;
    short count = 0;
    short cx, cy;
    cx = GetSystemMetrics(SM_CXSCREEN) ;
    cy = GetSystemMetrics(SM_CYSCREEN) ;
    cx /= 2, cy /= 2;
    do
    {
        HWND hTemp = FindWindowEx(NULL, hWnd, lpszClassName, NULL );
        hWnd = hTemp;
    } while (count < 5 && hWnd && ++count );
    if (count == 4)
    {
        MessageBox(NULL, L"Нельзя запустить 5 экземпляр!", NULL, MB_ICONSTOP | MB_OK);
        return FALSE;
    }
    //
    if (!RegClass(MainProc, lpszClassName, COLOR_3DSHADOW))
    {
        return FALSE;
    }
    //
    wchar_t buff[20];
    _itow(count + 1, buff, 10);
    wcscat(buff, L"-ое окно");
    hWnd = CreateWindow(lpszClassName, buff, WS_OVERLAPPEDWINDOW, 0 + ( count % 2 )*cx, 0 + ( count > 1)*cy, cx, cy, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
        return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    MSG message;
    while (GetMessage(&message, NULL, 0, 0))
    {
        DispatchMessage(&message);
    }
    return message.wParam;
}
 
 
 
 
BOOL RegClass(WNDPROC  lpfnProc, LPCTSTR lpszClass, UINT hbrBackground)
{
    WNDCLASS my_class;
    my_class.cbClsExtra = my_class.cbWndExtra = my_class.style = 0;
    my_class.hbrBackground = (HBRUSH)(hbrBackground + 1);
    my_class.hCursor = LoadCursor(NULL, IDC_ARROW);
    my_class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    my_class.hInstance = (HINSTANCE)GetModuleHandle(NULL);
    my_class.lpfnWndProc = lpfnProc;
    my_class.lpszClassName = lpszClass;
    my_class.lpszMenuName = NULL;
    return RegisterClass(&my_class);
}
 
 
 
 
LRESULT CALLBACK MainProc(HWND hWnd, UINT mess, WPARAM wParam, LPARAM lParam)
{
    switch (mess)
    {
    case WM_CLOSE:
    {
        short reply = MessageBox(hWnd, L"Вы действительно хотите выйти?", L"Сообщение", MB_YESNO);
        if (reply == IDYES)
        {
            DestroyWindow(hWnd);
        }
        break;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        break;
    }
    default:
    {
        return DefWindowProc(hWnd, mess, wParam, lParam);
    }
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2018, 16:30
Ответы с готовыми решениями:

Запрет повторного запуска оконного приложения с использованием семафоров
В сети масса примеров. Абсолютно всё для консоли. Вот одна из ссылок http://www.firststeps.ru/mfc/winapi/r.php?118 #include...

Запрет запуска определённого процесса
Всем привет) появилась необходимость запретить запуск программы, но знаний маловато а здесь и в гугле ничего толком не нашел и...

Запрет повторного запуска программы
Можете сказать почему он не работает? Вторая копия программы все равно запускается! --- HANDLE Test_Present =...

2
 Аватар для Michail97
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 384
12.02.2018, 16:31  [ТС]
Вот так, как всё выглядит
Миниатюры
Запрет запуска 5 экземпляра приложения  
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
12.02.2018, 18:53
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <windows.h>
#include <windowsx.h>
 
static const char szWindowClassName [] = "test_class";
static short int window_counter = 0;
 
static LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
    }
    return DefWindowProc (hWnd, msg, wParam, lParam);
}
 
static BOOL CALLBACK EnumWindowsCallback (HWND hWnd, LPARAM lParam)
{
    char tmp [256] = {0};
    GetClassName (hWnd, tmp, 256);
    if (!lstrcmp (szWindowClassName, tmp))
        window_counter ++;
    return TRUE;
}
 
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
    EnumWindows (&EnumWindowsCallback, 0);
    
    int x = 0;
    int y = 0;
    
    const int screen_width = GetSystemMetrics (SM_CXSCREEN);
    const int screen_height = GetSystemMetrics (SM_CYSCREEN);
    
    const int window_width = (screen_width >> 1);
    const int window_height = (screen_height >> 1);
    
    if (window_counter < 4)
    {
        if (window_counter == 1)
        {
            x = screen_width >> 1;
            y = 0;
        }
        if (window_counter == 2)
        {
            x = 0;
            y = screen_height >> 1;
        }
        if (window_counter == 3)
        {
            x = screen_width >> 1;
            y = screen_height >> 1;
        }
    }
    else
    {
        MessageBox (NULL, "=5", "Error!", MB_OK | MB_ICONERROR | MB_TOPMOST);
        return -1;
    }
    
    WNDCLASSEX wcex;
    wcex.cbSize        = sizeof (WNDCLASSEX);
    wcex.style         = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc   = WindowProcedure;
    wcex.cbClsExtra    = 0;
    wcex.cbWndExtra    = 0;
    wcex.hInstance     = hThisInstance;
    wcex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wcex.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wcex.lpszMenuName  = NULL;
    wcex.lpszClassName = szWindowClassName;
    wcex.hIconSm       = LoadIcon (NULL, IDI_APPLICATION);
    
    if (!RegisterClassEx (&wcex))
    {
        MessageBox (NULL, "Window Registration Failed!", "Error!", MB_OK | MB_ICONERROR | MB_TOPMOST);
        return -1;
    }
    
    HWND hWnd = CreateWindowEx (
                    0,
                    szWindowClassName,
                    "Test",
                    WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX,
                    x,
                    y,
                    window_width,
                    window_height,
                    HWND_DESKTOP,
                    NULL,
                    hThisInstance,
                    NULL);
    if (!hWnd)
    {
        MessageBox (NULL, "Window Creation Failed!", "Error!", MB_OK | MB_ICONERROR | MB_TOPMOST);
        UnregisterClass (szWindowClassName, hThisInstance);
        return -1;
    }
    
    ShowWindow (hWnd, SW_SHOWNORMAL);
    UpdateWindow (hWnd);
    
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
    {
        DispatchMessage (&msg);
        TranslateMessage (&msg);
    }
    
    UnregisterClass (szWindowClassName, hThisInstance);
    return (int) msg.wParam;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2018, 18:53
Помогаю со студенческими работами здесь

Запрет/Блокирование запуска программ с WinAPI
Добрый день, возникла такая задача, рационального решения пока я не вижу. Тут вопрос наверное в большей степени по WinAPI нежели...

Запрет закрытия приложения по Alt+F4
Какие сообщения обработать чтобы при нажатии на alt+f4 приложение не закрывалось?

Разное поведения запуска приложения
Проблема заключается в следующем: Есть программа (чужая) написанная на скорей всего на C#, если запускать программу из проводника, или из...

Запрет запуска приложения
Люди помогите пожалуйста,нужно запретить запуск определенного приложения допустим *.exe(программно на с++\builder) Заранее блогодарен.

Запрет запуска копии приложения
Недавно перешел на Linux, и если на винде в интернетах полно примеров, как запретить повторный запуск уже рабочего приложения (через...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru