Добрый день! Подскажите если сможете как решить следующую задачку. Есть сервис написанный на делфи, сервис должен запустить чужое приложение, пробовал сделать запуск через функции shellexecute и createprocess, приложение запускается (в диспетчере задач видно), но окна приложения нет. Галочку «разрешить взаимодействие с рабочим столом» ставил.
- Вопрос задан более трёх лет назад
- 9605 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 4
Сервис — он не от пользователя работает. И при работе сервиса нет такого понятия как «активный» рабочий стол, ведь ни для кого не секрет что можно открывать одновременно несколько учетных записей в данный момет времени, первая допустим основная, локально с компа, а вторая — через RDP, вот и получается что нет «активного» рабочего стола, а есть (скорее всего) список запущенных учетных записей из них уже и надо получать хэндл рабочего стола. Не знаю как вы пропустили этот момент, когда читали про сервисы, но я точно помню что реализовано это именно так. Советую почитать про Сервисы и Драйвера в Windows.
Установка и активация Delphi/Autocom 2016 (Delphi Cars и Delphi Trucks)
Ответ написан более трёх лет назад
Нравится 4 1 комментарий
Эх, так и не разобрался как можно задать на какой рабочий стол выводить.
P.S. Максимальное чего смог пока достичь, это через функцию CreateProcessWithLogonW запустить программу от конкретного пользователя, но при условии что он залогинился. Если вход в систему не произведен то ничего не запускается, а нужно имено это.
Если задача — запуск на рабочем столе активного пользователя (того, кто смотрит в монитор в данный момент), то можно сделать так:
Смысл в том, что начиная с Vista (если не ошибаюсь), запуск приложения в контексте системы весь интерактив возложит в «рабочий стол пользователя SYSTEM».
Но если пользователь залогинится после запуска — окно он не увидит, скорее всего. Решение: циклическая проверка «активности» пользователя в службе и запуск этим способом.
Ответ написан более трёх лет назад
Нравится 3 2 комментария
я буду циклически проверять залогинился пользователь или нет, как только залогинился, мне нужно будет закрыть программу и снова её запустить, так получается?
Если нужно обеспечить ровно одну копию процесса, то можно так:
Искать среди запущенных процессов нужный, сверять пользователя-«владельца» с «активным» и ежели не совпали, убивать и запускать новую копию указанным выше способом.
Источник: qna.habr.com
delphi запуск внешнего приложения
В этой статье вы научитесь применять функцию Windows API ShellExecute. Ее применяют в тех случаях, когда мы, например, хотим открыть файл в соответствии с его расширением, не зная, какая программа ассоциирована с таким файлами. Итак, начнем с простого:
— Запустить блокнот (notepad)
— Открыть текстовый файл c: ext.txt в блокноте
— Показать содержимое каталога c:archive
Установка и активация Autocom Delphi DS150E cars 2015.Release3
— Открыть файл в соответствии с расширение м
— Открыть html документ в браузере по умолчанию
— Дожидаемся окончания запущенной программы
Статья Запуск программ из Delphi раздела Программа и Интерфейс Приложения чужие может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
Пример показывает как из Вашей программы запустить внешнее приложение и подождать его завершения.
А вот пример вызова этой функции:
- Параметр FileName = Имя внешней программы.
- Параметр Params = Параметры, необходимые для запуска внешней программы
- Параметр WinState = Указывает — как будет показано окно:
Для этого параметра мы можем так же использовать следующие константы: SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_SHOWNORMAL
PS: Этот код тестировался в delphi версий 3, 4 и 5.
На этом уроке изучим запуск других приложений. Иногда из программы на Delphi требуется запустить другую программу. Для этого есть два способа и оба используют API -функции. Первый способ использует функцию API -функцию WinExec , а второй — ShellExecute . Посмотрим на применение этих функций в деле.
Сначала используем функцию ShellExecute . Для нее пример достаточно распространенный — мы сделаем гиперссылку на форме. Щелкаешь на ней — и оказываешься на некотором сайте. Часто такую ссылку можно видеть в окошке About . Для использования функции ShellExecute прежде всего добавляем ShellAPI в секцию uses нашего кода (иначе компилятор ругнется на эту функцию).
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ShellAPI;
Далее помещаем на форме Label , и делаем в нем надпись синей и подчеркнутой (как это и принято для гиперссылки). Делаем двойной щелчок мышью на нашем Label1 для перехода в окно кода.
В обработчике пишем следующий код:
procedure TForm1.Label1Click(Sender: TObject);
ShellExecute(Form1.Handle, ‘open’, ‘http: //www.ya.ru’,
nil, nil, SW_SHOWNORMAL)
Запускаем программу, щелкаем на нашей гиперссылке и оказываем на сайте. Все как и ожидалось.
Рассмотрим параметры нашей функции более подробно.
Первый параметр ( Form1.Handle у нас) — это указатель на окно, из которого запускается другое приложение.
Второй параметр (у нас это open ) — показывает, что мы делаем. Значение open для него — самое распространенное. Еще из распространенных значений этот параметр может принимать print (для печати, естественно) и nil (которое фактически тоже самое, что и open ).
Четвертый параметр (у нас он nil ) — это параметры для запускаемого exe-файла (который должен стоять третьим параметром). Например, сюда можно написать, что за файл мы хотим открыть в Блокноте.
Остальные параметры не столь важны, так что если интересно, то смотрите в help .
Что же до функции WinExec , то она оставлена только для совместимости.
Источник: computermaker.info
Разработка кроссплатформенных мобильных приложений в Delphi #3
2013-11-08 в 10:53, admin , рубрики: android, Delphi, Блог компании «Embarcadero (Borland)», метки: android, Delphi
Часть #1
Часть #2
Настройка среды и создание нового мобильного приложения.
В предыдущей части цикла мы определились с задачей и создали простейшее FM приложение, которое отображает список рецептов. При этом мы использовали библиотеку доступа к данным FireDAC и технологию связывания объектов LiveBinding. Также мы условились, что в рамках поставленной задачи будет создано два приложения, использующих единую кодовую базу. И теперь, настало время для, возможно, самой интересной части – создания первого Android приложения.
Прежде всего, необходимо произвести настройку среды. Если при установке RAD Studio вы не устанавливали инструменты разработки Android (JDK/SDK/NDK), то вам следует сделать это вручную. Так же необходимо установить USB драйвер для того Android устройства, с помощью которого будет производиться разработка приложения. Стоит отметить, что далеко не для всех Android устройств можно найти USB драйвер. В таком случае можно воспользоваться возможностью отладки через Wi-Fi.
При создании нового проекта нам предлагается воспользоваться одним из нескольких шаблонов мобильного приложения. Выберем шаблон Header/Footer, представляющий собой мобильную форму с двумя панелями инструментов (Toolbar). После выбора шаблона необходимо сохранить проект. Новый проект удобнее всего создавать с помощью Project Manafer (правая верхняя панель IDE), как это показано на рисунке. Таким образом, мы сможем работать сразу с двумя проектами в группе.
Главная форма приложения для выбранного нами шаблона по умолчанию адаптирована под устройство Google Nexus 4. С помощью выпадающего списка в правой верхней части дизайнера формы можно выбрать другое устройство. Для нашего приложения выберем одно из наиболее популярных планшетных устройств Google Nexus 7. Сразу же изменим и текст заголовка на главной форме (свойство Text компонента HeaderLabel).
Первый запуск приложения
Как вы уже поняли, для отладки приложения мы будем использовать физическое устройство, подключенное по USB. Хотя возможны и другие варианты (подключение с помощью Wi-Fi или использование эмулятора). Если вы подключили свой планшет или телефон в соответствии с инструкцией и активировали режим разработчика, то название вашего «девайса» появится в списке целевых устройств (Targets). Активируем его.
Еще раз убедитесь в том, что Android SDK настроен для вашего устройства, а т. н. «режим разработчика» активирован. Подробно весь процесс настройки среды для разработки Android приложения описан здесь.
Запускается мобильное приложение точно так же, как и обычное «настольное» (нажатием клавиши F9). Если вы все сделали правильно, то после компиляции вы увидите главную форму приложения на своем планшете.
Теперь попробуем реализовать тот же функционал, который мы реализовали в предыдущей части. Для этого добавим в текущий проект уже существующий модуль данных из предыдущего проекта (меню Project | Add to Project…). Как и в первом проекте, модуль надо включить в секцию Uses главной формы.
implementation uses uDM;
Собственно, теперь нам ничего не мешает использовать ту же процедуру установки соединения, которую мы использовали в «настольном» приложении:
function TDM.ConnectToDB: Boolean; begin try FDConnection1.Connected := True; FDTRecipe.Open; except end; Result:= FDConnection1.Connected; end; procedure TDM.DataModuleCreate(Sender: TObject); begin DM.ConnectToDB; end;
Таким образом, мы избавили себя от необходимости повторно писать код установки соединения.
Главная форма приложения
В принципе, разработка пользовательского интерфейса мобильного приложения это отдельная, весьма обширная тема. Зачастую, именно неправильно спроектированный GUI может стать причиной неудачи. И иногда программисты пытаются перенести свой опыт создания интерфейсов «настольных» приложений на мобильную разработку. Это не совсем правильно.
Перед тем, как приступить к написанию мобильного приложения стоит внимательно изучить базовые принципы дизайна интерфейсов. И, конечно же, стоит изучить интерфейсы популярных программ.
В нашем случае мы вполне можем организовать интерфейс главной формы мобильного приложения по образу «настольного» (на самом деле, интерфейс Windows приложения мы строили с учетом того, что нам придется делать мобильное приложение). Поместим на форму компоненты TPanel, TSplitter и TCalloutPanel. В Object Inspector поменяем их свойства следующим образом:
Panel1: TPanel Align = alLeft Splitter1: TSplitter Align = alLeft Width = 16 CalloutPanel1: TCalloutPanel Align = alClient Width = 630 TabOrder = 4 CalloutPosition = cpLeft
Для отображения списка рецептов мы точно также используем TListBox и TBindNavigator, которые расположим на левой панели. TTabControl расположим на компоненте TCalloutPanel и настроим для каждого из компонентов свойство Align.
Как и в прошлый раз, используем механизм LiveBinding для подключения набора данных. Данная процедура полностью аналогична той, которую мы проделали в предыдущей части, создавая «настольное приложение».
Как и в прошлый раз, нам потребуется создать некий инструмент для ввода названия рецепта. Если в настольном приложении мы могли использовать модальную форму, то концепция мобильных приложений в большинстве случаев предлагает другое решение, более мягко регламентирующее действие пользователя. Однако здесь мы используем «диалог», который по сути можно расценивать как разновидность модальной формы.
Создадим новую мобильную форму. На ней поместим панель, и уже на панели разместим те элементы управления, которые мы размещали на форме добавления рецепта в прошлый раз (TEdit и две кнопки). Значение свойства Align – alCenter. Для кнопок зададим значение свойства ModalResult (mrOk и mrCancel).
Для класса формы создадим следующий метод класса:
class procedure TfAddRecipe.ShowDialog(DataSet: TDataSet); begin fAddRecipe.ShowModal( procedure(ModalResult: TModalResult) begin if ModalResult= mrOk then begin if DataSet.State in [dsInsert, dsEdit] then DataSet.Post; fAddRecipe.Close; end else begin if DataSet.State in [dsInsert, dsEdit] then DataSet.Cancel; fAddRecipe.Close; end; end ); end;
При запуске приложения назначим данный метод в качестве обработчика события AfterInsert для единственного пока набора данных в программе.
procedure THeaderFooterForm.FormShow(Sender: TObject); begin DM.FDTRecipe.AfterInsert:= TfAddRecipe.ShowDialog; end;
Данная форма будет вызываться при каждом добавлении записи в набор данных FDTRecipe.
Естественно, такой код нуждается в оптимизации. Создавать экземпляр формы при запуске приложения — не лучшая идея. Особенно для мобильных приложений. Но это тема для отдельного разговора, а пока из соображений наглядности оставим все как есть.
Развертывание (deployment) Android приложения
Перед тем, как запустить приложение, работающее с БД на Android, следует сделать определенные настройки, которые позволят перенести базу данных на мобильное устройство, и дадут возможность приложению «увидеть» базу. Для этого следует использовать Deployment Manager (меню Project |Deployment).
Убедитесь, что выбрана отладочная конфигурация для платформы Android. В выпадающем списке на верхней панели инструментов должно быть выбрано значение Debug configuration – Android platform.
Для того, что бы при развертывании приложения на устройство переносилась и база данных, следует воспользоваться кнопкой «Add files» (добавить файлы) и выбрать файл базы данных.
Введите assets в качестве значения поля Remote Path, а значение поля Platform установите Android. Директория assets это специальная директория, предназначенная для хранения вспомогательных ресурсов приложения. В поле Platform следует выбрать Android.
Вы можете нажать кнопку Deploy, что бы протестировать процесс развертывания приложения.
И, наконец, для того, что бы приложение заработало, следует сделать еще один важный шаг – определить событие компонента FDConnection1 следующим образом:
procedure TDM.FDConnection1BeforeConnect(Sender: TObject); begin FDConnection1.Params.Values[‘Database’] := ‘$(DOC)/db.s3db’; end;
Директива компилятора передается для того, что бы данный код выполнялся только на Android устройствах. Таким образом, мы указываем приложению относительный путь к БД.
Запускаем приложение, и на экране устройства получаем практически полный аналог Windows приложения, которое мы создали в предыдущей части.
В этой части мы построили первое мобильное приложение и разобрались с тем, насколько процесс создания мобильных приложений в Delphi схож и насколько он отличается от процесса создания «обычного» desktop приложения. Естественно, пока мы реализовали только базовый функционал. Это касается как логики программы, так и ее интерфейса. Но, всему свое время. В следующей части мы продолжим работу над Windows приложением и более углубленно познакомимся с возможностями и принципами работы механизма LiveBinding.
Источник: www.pvsm.ru