#include <windows.h> #include <Psapi.h> #include <stdio.h> #define ID_LISTBOX 100 #define MY_TIMER 102 #define TIMER_PERIOD 750 HWND hListbox, hwnd; bool bFirstInstance = true; HANDLE myEvent; LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); char szClassName[] = "CodeBlocksWindowsApp"; char szTitle[] = "Code::Blocks Template Windows App"; BOOL InitWndClass(HINSTANCE hThisInstance) { WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; // Неудача РїСЂРё регистрации класса РѕРєРЅР° if (!RegisterClassEx (&wincl)) { return FALSE; } return TRUE; } bool IsFirstInstance() { HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "VolvoMutex1.0"); if (!hMutex) { // если программа запускается первый раз, то создаем Mutex hMutex = CreateMutex(0, 0, "VolvoMutex1.0"); return true; } return false; } int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { MSG messages; bFirstInstance = IsFirstInstance(); // Регистрируем класс РѕРєРЅР° РІ любом случае if(!InitWndClass(hThisInstance)) { return 0; } // Создаем класс РѕРєРЅР° hwnd = CreateWindowEx(0, szClassName, (bFirstInstance ? szTitle : ""), // первая РєРѕРїРёСЏ - szTitle, остальные - пусто WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL); if(bFirstInstance) { // Первая РєРѕРїРёСЏ приложения: hListbox = CreateWindow("LISTBOX", NULL, (WS_CHILD | LBS_STANDARD | WS_VSCROLL | LBS_DISABLENOSCROLL | WS_VISIBLE) & (~LBS_SORT), 30, 30, 400, 320, hwnd, (HMENU)ID_LISTBOX, hThisInstance, NULL ); ShowWindow (hwnd, nCmdShow); // Рнформация... SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)"First instance of application"); // Создаем событие ... myEvent = CreateEvent(NULL, FALSE, FALSE, "VolvoTestEvent"); // ... Рё устанавливаем его SetEvent(myEvent); } else { // РќРµ первый экземпляр: // Находим первую РєРѕРїРёСЋ - единственную, Сѓ которой есть РѕРєРЅРѕ СЃ заголовком ... HWND first_inst = FindWindow(NULL, szTitle); if(first_inst) { // ... Рё переносим его РЅР° первый план, если нашли SetForegroundWindow(first_inst); // Находим РІ РѕРєРЅРµ первой РєРѕРїРёРё ListBox, РєСѓРґР° будем записывать hListbox = FindWindowEx(first_inst, NULL, "listbox", NULL); if(hListbox) { // Рнформация SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)"Another instance of application"); } else { // РќРµ нашли ListBox MessageBox(NULL, "Cannot find LISTBOX control", "Error", MB_OK | MB_ICONEXCLAMATION); } } else { // РќРµ нашли РѕРєРЅРѕ первой РєРѕРїРёРё MessageBox(NULL, "Cannot find first-instance window", "Error", MB_OK | MB_ICONEXCLAMATION); } // Получаем созданный ранее Event myEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "VolvoTestEvent"); } // Р’СЃРµ, разные действия для первой Рё РЅРµ первой РєРѕРїРёРё закончились... // Теперь для любой РєРѕРїРёРё устанавливаем таймер SetTimer(hwnd, MY_TIMER, TIMER_PERIOD, NULL); // Рзапускаем РѕСЃРЅРѕРІРЅРѕР№ цикл обрабртки сообщений while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } // Callback-функция, будет использоваться РїСЂРё закрытии первой РєРѕРїРёРё приложения BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { HWND hWndFirst = (HWND)lParam; if(hwnd != hWndFirst) { char s[256] = ""; GetClassName(hwnd, s, 256); if(!strcmp(s, szClassName)) { PostMessage(hwnd, WM_DESTROY, 0, 0); } } return TRUE; } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_TIMER: { // Ждем наступления события WaitForSingleObject(myEvent, INFINITE); char s[50] = {0}; sprintf(s, "Event: %d", myEvent); // Рнформация - откуда РїСЂРёС…РѕРґСЏС‚ данные SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)s); for(int i = 0; i < 5; i++) { // считаем Рё показываем, что что-то РїСЂРѕРёСЃС…РѕРґРёС‚ sprintf(s, "App = %d; n = %d", hwnd, i); SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)s); } SendMessage(hListbox, LB_SETCARETINDEX, SendMessage(hListbox, LB_GETCOUNT, 0, 0), TRUE); SetEvent(myEvent); break; } case WM_DESTROY: if(bFirstInstance) { EnumWindows(&EnumWindowsProc, (LPARAM)hwnd); } CloseHandle(myEvent); KillTimer(hwnd, MY_TIMER); PostQuitMessage(0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }