Автор | Сообщение |
|
| постоянный участник
|
Пост N: 7297
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.23 10:02. Заголовок: ShellExecute в МиниГуи
С некоторых пор перестало показываться окно при вызове команды ShellExecute. Раньше автоматом было. Т.е. фокус переходил на проводник. Что нужно сделать, чтобы фокус переходил на проводник ? Вот код: // Как программно открыть папку и выделить файл? // ShellExecute(Application.Handle, 'OPEN', 'EXPLORER', '/select, ' + path, '', SW_NORMAL) FUNCTION RunExplFile2(cFile) ShellExecute( 0, "open", "explorer.exe", '/select, ' + cFile, , SW_SHOWNORMAL ) //InKeyGui(5000) - это не помогает. RETURN NIL
|
|
|
Ответов - 34
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 4240
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.23 00:47. Заголовок: Andrey пишет Только ..
Andrey пишет цитата: | Только что попробовал, вот результат - титул окна НЕ МЕНЯЕТСЯ : |
| Смотри на окне Notepad запущенного + смотри в списке процессов на кнопке (1), нажимая кнопку "Reset", можешь задать текст справа внизу в GETBOX "note" и нажать кнопку "Reset". Для фильтра процессов. А то что ты смотришь в логе - так там делать надо, там ничего нет Пример тут https://TransFiles.ru/o72ak Кнопка 4) ... - запуск Notepad.exe PS Текст в GETBOX тебе надо задавать на рус. "блок" Класс для notepad.exe у тебя ? У меня "Notepad" PS2 добавил вывод в log FUNCTION StartNotepad(cFile, cCapt) ... IF lNew ... END ? procname(), GetWindowText( hWnd ) ENDIF результат 1 29820426 Notepad Demo2.hbp - Notepad STARTNOTEPAD Demo2.hbp - Notepad - my start ! ----- Вызов из: TEST_3(665) -> demo2.prg hProcessHandleShellExecuteEx= NIL
|
|
|
|
| |
Пост N: 1891
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.03.23 09:10. Заголовок: Andrey пишет: А есл..
Andrey пишет: цитата: | А если запущено уже несколько Notepad пользователем, то что будет ? |
| а что будет результатом такой проверки ? GetWindowThreadProcessID(hWnd, @nT, @nP) if hProcess == nP ? "Вот оно окно , делай что хочешь hWnd = ", hWnd, cClassName end
|
|
|
|
| постоянный участник
|
Пост N: 4241
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.23 09:58. Заголовок: Haz пишет ..
Haz пишет цитата: | if hProcess == nP ? "Вот оно окно , делай что хочешь hWnd = ", hWnd, cClassName end |
| Что бы делать, что хочешь, надо, как правило, подождать, дать сформироваться окну и его Title Например у Explorer.exe проскакивают 2-а Title (что я поймал), если не ждать wApi_Sleep(1000), и сразу ставить свой, то не получится контролировать 2-ой свой запуск. Т.е. возврат от ShellExecuteEx() говорит лишь о том, что запуск произошел или нет. Это ремарка
|
|
|
|
| |
Пост N: 1892
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.03.23 10:05. Заголовок: Дарю решение в одну строку, но без Титла
все просто , на передний план, но без hWhd И соответственно без операций с окном ( титлы, размер и пр ) SetForegroundWindow(GetDesktopWindow()) hPID := hb_processOpen( "explorer.exe /select," + cFile,,,,.F., @hProcess) // откроет explorer на переднем плане окон // Дальше по тексту //
|
|
|
|
| постоянный участник
|
Пост N: 4242
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.23 10:29. Заголовок: Haz пишет все прост..
Haz пишет цитата: | все просто , на передний план, но без hWhd И соответственно без операций с окном ( титлы, размер и пр ) |
| Ни разу не нужно было запускать explorer.exe или notepad.exe, как в примерах. А вот с DosBox и консольными старыми clipper программами под ним + vwt подпрограммы - это сколько угодно, даже размеры и позиции окон приходилось ставить. И SetForegroundWindow(GetDesktopWindow()) не на всех 10-ках срабатывал, приходилось minimaize, restore еще делать до того.
|
|
|
|
| |
Пост N: 1893
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.03.23 10:43. Заголовок: SergKis пишет: прих..
SergKis пишет: цитата: | приходилось minimaize, restore еще делать до того. |
| не вопрос , тогда так ( вместо SetForgeroundWindow() - любые действия с хендлом ) Func Main local hWnd := 0 local aWin := {} local hPid, hProcess local cFile := "C:\HmG_PROJECT\Z.CMD" // Здесь свой файл указать local aArray := hb_Atokens( cFile , "\" ) local cText := aArray[Len(aArray)-1] hPID := hb_processOpen( "explorer.exe /select," + cFile,,,,.F., @hProcess) hb_idlesleep(1) aWin := EnumWindows() for each hWnd in aWin if UPPER(GetWindowText(hWnd)) == UPPER( cText ) SetWindowText( hWnd, aArray[Len(aArray)]) // или свой текст SetForegroundWindow(hWnd) // или minimaize, restore end END return nil
|
|
|
|
| постоянный участник
|
Пост N: 4243
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.23 11:05. Заголовок: Haz пишет не вопрос ..
Haz пишет цитата: | не вопрос , тогда так ( вместо SetForgeroundWindow() - любые действия с хендлом ) |
| Вопросы остаются. cFile := "C:\HmG_PROJECT\Z.CMD". Запуск "explorer.exe /select," + cFile даст в title имя каталога HmG_PROJECT cFile := "C:\HmG_PROJECT\demo.hbp". Запуск "explorer.exe /select," + cFile даст в title имя каталога HmG_PROJECT тоже повторные запуски будут с аналогичным результатом и т.д. Для notepad.exe то же самое, т.е. управления нет и надо добавлять. В примере выше это и показано, есть запуски многократные, есть контролируемые. Т.е. у меня вопросы по GetWindowThreadProcessId(h, @nThr, @nPid) сняты. Спасибо
|
|
|
|
| постоянный участник
|
Пост N: 7316
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.03.23 23:12. Заголовок: А как можно узнать п..
А как можно узнать по хендлу полный путь запущенной программы ? Поискал в примерах, но там что-то непонятно как это делается...
|
|
|
|
| |
Пост N: 1894
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.03.23 23:20. Заголовок: Andrey пишет: как м..
Andrey пишет: цитата: | как можно узнать по хендлу полный путь запущенной программы |
| По хендлу чего ? Окна ? Процесса ? Если процесса, самый простой путь через wmi Select * from win32_process . Если хендлу окна, то сначала ищем процесс (как выше писали ) , а потом пять wmi
|
|
|
|
| постоянный участник
|
Пост N: 7317
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.03.23 23:25. Заголовок: Haz пишет: По хендл..
Haz пишет: цитата: | По хендлу чего ? Окна ? Процесса ? Если процесса, самый простой путь через wmi |
| По хендлу окна. Вроде нашёл - GetFullFileNameByHandle (aWin , @cFullFileName) Правильно ли я делаю ? LOCAL oTsb := oHmgData() LOCAL cSuperHd := oWnd:Cargo:cTitle LOCAL cTitle, aWin, hWnd, nThr, nPid, cClass, cFullFileName, aProcess aProcess := {} aWin := EnumWindows() For each hWnd in aWin cClass := GetClassName( hWnd ) cTitle := GetWindowText( hWnd ) GetWindowThreadProcessID(hWnd, @nThr, @nPid) GetFullFileNameByHandle (hWnd, @cFullFileName) AADD( aProcess, { hWnd, nThr, nPid, cClass, cTitle, cFullFileName } ) Next ? "aProcess=",aProcess ; ?v aProcess ; ? Получается непонятка у меня: В проводнике по другому, ну это понятно... А почему строка 'Процессы в памяти: hWnd, nTread, nPID, nProcID' непонятно кому принадлежит ?
|
|
|
|
| постоянный участник
|
Пост N: 4246
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.03.23 06:35. Заголовок: Andrey пишет А почем..
Andrey пишет цитата: | А почему строка 'Процессы в памяти: hWnd, nTread, nPID, nProcID' непонятно кому принадлежит ? |
| Почему не понятно принадлежность указанного, не знаю , но кнопку добавлял ты сам ручками @ nY, nX BUTTONEX Btn_5 WIDTH nWBtn HEIGHT nHBtn ; CAPTION '(5)' ACTION _wPost(5, , This.Name) ; TOOLTIP 'Процессы в памяти: hWnd, nTread, nPID, nProcID'
|
|
|
|
|
| постоянный участник
|
Пост N: 7318
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.03.23 10:02. Заголовок: Т.е. нажатая кнопка ..
Т.е. нажатая кнопка на форме тоже отображается в процессах ? Другие кнопки не показываются. Фигня какая то получается. А почему стандартный проводник этого не отображает ?
|
|
|
|
| |
Пост N: 1895
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.03.23 13:08. Заголовок: Andrey пишет: прово..
Andrey пишет: цитата: | проводнике по другому, ну это понятно. |
|
в диспетчере задач не тот хендл указан , нуля не хватает
|
|
|
|
| постоянный участник
|
Пост N: 7319
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.03.23 16:43. Заголовок: Haz пишет: нуля не ..
Haz пишет: Проглядел...
|
|
|
Ответов - 34
, стр:
1
2
All
[только новые]
|
|