Использование мутекс для восстановления приложения, скрытого в системном лотке, приводит к минимизации окна, становясь нC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование мутекс для восстановления приложения, скрытого в системном лотке, приводит к минимизации окна, становясь н

Сообщение Anonymous »

В Rad Studio 12 C ++ (Delphi /C ++ Builder), используя vcl.

Я сталкиваюсь с проблемой в моем приложении, где кнопка Minimize не работает после восстановления главного окна из подноса системы Mutex, чтобы вывести ранее запускаемый экземпляр на передний план. HANDLE hMutex;
hMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, "Home-work-2025-0x1");
if(!hMutex) hMutex = CreateMutexA(0,0, "Home-work-2025-0x1");
else{
HWND hFirst = ::FindWindow(NULL, L"Home Work");
if(hFirst){
if(IsIconic(hFirst)){
ShowWindow(hFirst, SW_RESTORE);
SetForegroundWindow(hFirst);
}else SetForegroundWindow(hFirst);
}
else return(-2);

return(2);
}

Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();

ReleaseMutex(hMutex);
< /code>
Само окно восстанавливается правильно, но кажется, что его состояние не полностью обновлено.
Вот что я пробовал до сих пор, и оно не работает: < /p>
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hFirst, &wp);
wp.showCmd = SW_RESTORE;
SetWindowPlacement(hFirst, &wp);

LONG style = GetWindowLong(hFirst, GWL_STYLE);
if (!(style & WS_MINIMIZEBOX) || !(style & WS_SYSMENU)) {
style |= WS_MINIMIZEBOX | WS_SYSMENU;
SetWindowLong(hFirst, GWL_STYLE, style);
}

RedrawWindow(hFirst, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
UpdateWindow(hFirst);
SendMessage(hFirst, WM_ACTIVATE, WA_ACTIVE, 0);
SetWindowPos(hFirst, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);

SetActiveWindow(hFirst);
MSG msg;
while (PeekMessage(&msg, hFirst, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

PostMessage(hFirst, WM_SYSCOMMAND,SC_RESTORE, 0);

Важный , с искалеченной кнопкой Min и восстановленным окном, просто нажав на опцию «Show/Hide» в моем контекстном меню Trayicon, с обычным кодом:
if(Form1->WindowState == wsMinimized){
Form1->WindowState = wsNormal;
Form1->Show();
}else if(Form1->WindowState == wsNormal){
Form1->WindowState = wsMinimized;
}
< /code>
, кажется, «исправить» проблему, и кнопка Minimize снова начинает работать.void __fastcall TForm1::FormPaint(TObject *Sender)
{
Form1->Show();
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... lts-in-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»