Страницы

Поиск по вопросам

Показаны сообщения с ярлыком firemonkey. Показать все сообщения
Показаны сообщения с ярлыком firemonkey. Показать все сообщения

воскресенье, 15 декабря 2019 г.

Как в Delphi сделать окно всегда неактивным

#windows #delphi #winapi #firemonkey


То есть даже при нажатии кнопки внутри окна оно само не должно становиться активным.
Подходит любое решение, через WinAPI в том числе. 

Фреймворк FMX
    


Ответы

Ответ 1



Для VCL Вам нужно у формы переопределить метод CreateParams и в поле Params.ExStyle добавить флаг WS_EX_NOACTIVATE procedure TForm1.CreateParams(var AParams: TCreateParams); begin inherited CreateParams(AParams); AParams.ExStyle := AParams.ExStyle or WS_EX_NOACTIVATE; end; При работе с WinAPI этот флаг нужно добавить в первый параметр функции CreateWindowEx() Для FMX, исходя из метода TPlatformWin.CreateWindow вы параметр ExStyle не переопределите Если отказаться от кроссплатфоменности FMX, то для созданного окна можно поменять параметр EX_STYLE вызвав функцию SetWindowLongPtr procedure MakeNoActivate(AWnd: HWND); var LOldVal: NativeInt; begin LOldVal := GetWindowLongPtr(AWnd, GWL_EXSTYLE); SetWindowLongPtr(AWnd, GWL_EXSTYLE, LOldVal or WS_EX_NOACTIVATE); end; Получить HWND у FMX формы можно так uses FMX.Platform.Win; ............ var LWnd: HWND begin LWnd := FmxHandleToHWND(Form1.Handle); ................ end;

среда, 10 июля 2019 г.

Программное удаление приложения Android из списка недавно запущенных приложений

Что происходит на уровне системы, когда мы нажимаем хардварную кнопку «приложения», и в окне «последние приложения» удаляем приложение? На пользовательском уровне приложение удаляется из списка, если у приложения был запущен сервис, тот теряет процесс приложения и перезапускается.
Необходимо повторить это действие пользователя (удаление программы из списка последних приложений) программно из самого приложения, со всеми сопутствующими процедурами системы. Если нет, тогда удаление из списка другим приложением.
Сокрытие приложение через манифест не подходит.
Кто может помочь в этом вопросе, помогите пожалуйста.


Ответ

Только что проверял на API21 вот этот код - он работает - закрывает приложение и убирает из списка задач:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { finishAndRemoveTask(); } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { finishAffinity(); } else { finish(); } } Process.killProcess(Process.myPid());

Похожий код в документации: тык

понедельник, 19 ноября 2018 г.

Как в Delphi сделать окно всегда неактивным

То есть даже при нажатии кнопки внутри окна оно само не должно становиться активным. Подходит любое решение, через WinAPI в том числе.
Фреймворк FMX


Ответ

Для VCL Вам нужно у формы переопределить метод CreateParams и в поле Params.ExStyle добавить флаг WS_EX_NOACTIVATE
procedure TForm1.CreateParams(var AParams: TCreateParams); begin inherited CreateParams(AParams); AParams.ExStyle := AParams.ExStyle or WS_EX_NOACTIVATE; end; При работе с WinAPI этот флаг нужно добавить в первый параметр функции CreateWindowEx() Для FMX, исходя из метода TPlatformWin.CreateWindow вы параметр ExStyle не переопределите
Если отказаться от кроссплатфоменности FMX, то для созданного окна можно поменять параметр EX_STYLE вызвав функцию SetWindowLongPtr
procedure MakeNoActivate(AWnd: HWND); var LOldVal: NativeInt; begin LOldVal := GetWindowLongPtr(AWnd, GWL_EXSTYLE); SetWindowLongPtr(AWnd, GWL_EXSTYLE, LOldVal or WS_EX_NOACTIVATE); end;
Получить HWND у FMX формы можно так
uses FMX.Platform.Win; ............ var LWnd: HWND begin LWnd := FmxHandleToHWND(Form1.Handle); ................ end;