«A good example is a debugger when it hits a breakpoint.»
Добавлено
не работает, причем честно об этом говорит (
Цитата:
Application.BringToFront; |
Сначала нужно вызвать
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
Зтем можно вызывать SetForegroundWindow.
Но это несовсем корректная техника. Для того и изменили поведение функции SetForegroundWindow, чтобы некоторые не доставали своими выскакивающими табличками.
сначала сворачиваем нашу прогу
Application.Minimize;
если «сворачивали в трей», то
if not IsWindowVisible(Application.Handle) then
ShowWindow(Application.Handle, SW_SHOW);
ну и восстанавливаем.
Application.Restore;
а уже при ресторе окно вылазит вперёд
кстати, если кто-то предложит лучший метод (без Minimize), буду очень благодарен
Как закрепить окно поверх всех окон в Windows | DeskPins
Цитата:
SystemParametersInfo не принёс нужного результата что с ним, что без него. |
Что значит что с ним что без него?
Функция SystemParametersInfo вообще отработала корректно или ты не проверял на предмет ошибки?
Так вот если не проверял то проверь. Это делается с помощью GetLastError если функция SystemParametersInfo вернёт тебе ноль.
Если же функция отработала успешно, то вызови её же но с параметром SPI_GETFOREGROUNDLOCKTIMEOUT и убедись что она возвратит ноль.
После корректного вызова этой функции и установки свойства SETFOREGROUNDLOCKTIMEOUT в ноль система будет сразу делать окно активным с помощью SetForegroundWindow. Система не будет вызывать функцию FlashWindowEx.
Цитата:
SystemParametersInfo не принёс нужного результата что с ним, что без него. |
не надо ля-ля. Все работает.
я не знаю, какие у вас винды, а уменя WinXp.
под Win2000 всё точно так же.
Да, такая ситуация тоже возможна и она является штатной. Если текущий foreground-процесс вызвал функцию LockSetForegroundWindow.
Цитата:
GetLastError возвращает 5 |
Проверь параметры.
Цитата:
Злой ты. Нужно же стоб приложение сворачивалось и разворачивалось! |
Согласен что нужно. Но это просто один из вариантов как всё-таки сделать своё окно поверх всех, даже тогда когда никто этого нехочет и всеми средствами препятствует этому. Появится активное системное модальное окно, а после его закрытия уже делай основым то из своих окно которое необходимо.
Работа с окнами в Windows 10
Цитата:
Проверь параметры. |
На некорректные параметры такую ошибку система не выдаст. С параметрами у него судя по всему всё в порядке. А вот поотключать все лишние запущенные приложения попробовать стоит. Фалит из-за одного из них.
Цитата:
если «сворачивали в трей», то if not IsWindowVisible(Application.Handle) then ShowWindow(Application.Handle, SW_SHOW); |
Страницы: 1 2 |
Источник: forum.ru-board.com
Оператор AppActivate
Синтаксис оператора AppActivate состоит из следующих именованных аргументов:
заголовок | Обязательно. Строковое выражение, указывающее заголовок в строке заголовка окна приложения, которое необходимо сделать активным. Для активации приложения на месте заголовка может использоваться идентификатор задачи, возвращаемый функцией Shell. |
wait | Необязательный параметр. Логическое значение, указывающее наличие фокуса в вызывающем приложении перед активацией другого. При значении False (по умолчанию) указанное приложение сразу становится активным, даже если вызывающее приложение не имеет фокуса. Если задано значение True, вызывающее приложение ожидает, пока оно не перейдет в фокус, а затем активирует указанное приложение. |
Замечания
Оператор AppActivate перемещает фокус на именованное приложение или окно, но не влияет на его размер. Если пользователь выполняет некоторые действия, чтобы изменить фокус или закрыть окно, фокус перемещается с окна активированного приложения. Для запуска приложения и выбора стиля окна используйте функцию Shell.
В определении того, какое приложение сделать активным, title сравнивается со строкой заголовка каждого запущенного приложения. Если точного соответствия нет, активируется любое приложение, строка заголовка которого начинается с title. Если сразу несколько приложений имеют имя title, одно из них активизируется произвольным образом.
Пример
В этом примере показаны различные варианты использования оператора AppActivate для активации окна приложения. Операторы оболочки предполагают, что приложения находятся по указанным путям. В macOS диск по умолчанию обозначается «HD», а части аргумента «путь» отделяются друг от друга двоеточиями вместо обратной косой черты.
Dim MyAppID, ReturnValue AppActivate «Microsoft Word» ‘ Activate Microsoft ‘ Word. ‘ AppActivate can also use the return value of the Shell function. MyAppID = Shell(«C:WORDWINWORD.EXE», 1) ‘ Run Microsoft Word. AppActivate MyAppID ‘ Activate Microsoft ‘ Word. ‘ You can also use the return value of the Shell function. ReturnValue = Shell(«c:EXCELEXCEL.EXE»,1) ‘ Run Microsoft Excel. AppActivate ReturnValue ‘ Activate Microsoft ‘ Excel.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник: learn.microsoft.com
Объект WScript.Shell метод AppActivate — Как активировать окно Windows
Объектная модель Windows Script Host
Автор Coding На чтение 6 мин Просмотров 591 Опубликовано 18.12.2014
Здравствуйте, с вами автор блога scriptcoding.ru. Сегодня мы рассмотрим, как активировать окно Windows заданного приложения программным методом. Статья будет интересна как рядовым пользователям, так и начинающим программистам.
И так, давайте рассмотрим метод AppActivate объекта WScript_Shell, который позволяет сделать активное окно Window заданной программы. Давайте мысленно подумаем, где метод AppActivate может пригодиться: у нас работает три разных приложения, каждое из них находится в состоянии ожидания ввода данных. Задача – написать сценарий, который обработает нужную информацию, и в зависимости от ее типа, передаст ее той или иной программе.
Как активировать окно Windows программным путем
Что бы имитировать ввод данных с клавиатуры можно использовать функцию SendKeys, вот только есть одна беда, данные будут отправляться в слепую, по принципу, кто активен – тот и получил. Вот тут-то нам и пригодится функция AppActivate, которая позволяет активировать Windows окно, давайте посмотрим на ее синтаксис:
AppActivate (String | ProcessID) – Видим, что метод может принимать только один параметр, который, в свою очередь, может быть или строкой (String), или целым числом (ProcessID). В первом случае, мы передаем методу AppActivate имя диалогового окна того приложения, которое хотим сделать активным, во втором случае – идентификатор процесса заданной программы.
Вроде всё понятно, но есть один подводный камень. Если мы одновременно запустим несколько экземпляров одной программы , например, программу Блокнот, то мы увидим, что заголовки окон идентичны, в этом случае, метод AppActivate сделает активное окно того экземпляр, который первый в его внутреннем списке, грубо говоря, мы не сможем активировать окно ОС Windows для нужной нам копии . Но, зато, для активации Windows окна можно использовать идентификатор процесса – его можно узнать, запустив диспетчер задач и перейдя на вкладку процессы, имя процесса для программы _Блокнот_ – notepad.exe.
В последнем случае тоже есть подводный камень – нам придется запустить приложение и дополнительно рассмотреть его идентификатор. Но, так мучиться не нужно, есть прекрасная функция Exec, которая позволяет запустить исполняемый файл и получить его идентификатора.
Хорошо, давайте посмотрим на следующий пример на языке vbscript:
‘*********************************************************************************** ‘ Wscript_Shell_метод_AppActivate ‘ Как активировать окно Windows приложения ‘ AppActivate1.vbs ‘*********************************************************************************** Option Explicit dim WshShell dim note_1, note_2, note_3 ‘ Создаем ссылку на объект WScript_Shell set WshShell = WScript.CreateObject(«WScript.Shell») ‘———————————————————————— ‘ запускаем три копии _блокнота_ ‘———————————————————————— ‘ первый экземпляр set note_1 = WshShell.Exec(«notepad.exe») ‘ ждем 500 миллисекунд WScript.Sleep 500 ‘ отправляем строку WshShell.SendKeys («первая копия») ‘———————————————————————— ‘ второй экземпляр set note_2 = WshShell.Exec(«notepad.exe») ‘ ждем 500 миллисекунд WScript.Sleep 500 ‘ отправляем строку WshShell.SendKeys («вторая копия») ‘———————————————————————— ‘ третий экземпляр set note_3 = WshShell.Exec(«notepad.exe») ‘ ждем 500 миллисекунд WScript.Sleep 500 With WshShell ‘ отправляем строку .SendKeys («третья копия») ‘———————————————————————— ‘ запускаем калькулятор .Exec(«calc.exe») ‘ пробуем активировать окно Windows по его имени ‘ потерпим неудачу. .AppActivate («Безымянный — Блокнот») MsgBox «Какой экземпляр активирован?» ‘ активное окно второй копии _блокнота_ .AppActivate (note_2.ProcessID) End With MsgBox «Какой экземпляр активирован?»
‘***********************************************************************************’ Wscript_Shell_метод_AppActivate’ Как активировать окно Windows приложения’ AppActivate1.vbs’***********************************************************************************Option Explicitdim WshShelldim note_1, note_2, note_3′ Создаем ссылку на объект WScript_Shellset WshShell = WScript.CreateObject(«WScript.Shell»)’————————————————————————’ запускаем три копии _блокнота_’————————————————————————’ первый экземплярset note_1 = WshShell.Exec(«notepad.exe»)’ ждем 500 миллисекундWScript.Sleep 500′ отправляем строкуWshShell.SendKeys («первая копия»)’————————————————————————’ второй экземплярset note_2 = WshShell.Exec(«notepad.exe»)’ ждем 500 миллисекундWScript.Sleep 500′ отправляем строкуWshShell.SendKeys («вторая копия»)’————————————————————————’ третий экземплярset note_3 = WshShell.Exec(«notepad.exe»)’ ждем 500 миллисекундWScript.Sleep 500With WshShell ‘ отправляем строку .SendKeys («третья копия») ‘———————————————————————— ‘ запускаем калькулятор .Exec(«calc.exe») ‘ пробуем активировать окно Windows по его имени ‘ потерпим неудачу. .AppActivate («Безымянный — Блокнот») MsgBox «Какой экземпляр активирован?» ‘ активное окно второй копии _блокнота_ .AppActivate (note_2.ProcessID)End WithMsgBox «Какой экземпляр активирован?»
В данном примере, мы трижды запускаем программу Блокнот, причем, сразу после запуска, симулируем ввод текста, причем, для каждого экземпляра разный, это позволит нам видеть, действительно ли мы смогли активировать нужное окно Windows. Мы дважды используем метод _AppActivate_, сперва пробуем активировать окно программы по имени ( тут нет никакой логики, так как все три окна имеют одинаковое имя ), а потом пробуем активировать окно программы Windows для второй копии по его идентификатору.
А вот аналогичный пример, но уже на языке jscript:
//*********************************************************************************** // Wscript_Shell_метод_AppActivate // Как активировать окно Windows приложения // AppActivate1.js //*********************************************************************************** var WshShell1; var note_1, note_2, note_3; // Создаем ссылку на объект WScript.Shell WshShell1 = WScript.CreateObject(«WScript.Shell»); //———————————————————————— // запускаем три_экземпляра блокнота //———————————————————————— // первый экземпляр note_1 = WshShell1.
Exec(«notepad.exe»); // ждем 500 миллисекунд WScript.Sleep (500); // отправляем строку WshShell1.
SendKeys («экземпляр_первый»); //———————————————————————— // второй_экземпляр note_2 = WshShell1.Exec(«notepad.exe»); // ждем 500 миллисекунд WScript.
Sleep (500); // отправляем строку WshShell1.SendKeys («экземпляр_второй»); //———————————————————————— // третий_экземпляр note_3 = WshShell1.
Exec(«notepad.exe»); // ждем 500 миллисекунд WScript.Sleep (500); with(WshShell1) // отправляем строку SendKeys («экземпляр_третий»); //———————————————————————— // запускаем калькулятор Exec(«calc.exe»); // пробуем активировать окно ОС Windows по его имени // потерпим неудачу.
AppActivate («Безымянный — Блокнот»); WScript.Echo(«Какой_экземпляр активирован?»); // активное окно второго_экземпляра _блокнота_ AppActivate (note_2.ProcessID) > WScript.Echo(«Какой_экземпляр активирован?»);
И так, в этой статье мы рассмотрели объект Wscript_Shell сервера Windows Script Host, а именно: метод _AppActivate_, который позволяет активировать окно Windows приложения.
Источник: scriptcoding.ru