В 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