Автор | Сообщение |
|
| постоянный участник
|
Пост 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
[только новые]
|
|
|
| moderator
|
Пост N: 2101
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.02.23 13:16. Заголовок: Andrey пишет: Что н..
Andrey пишет: цитата: | Что нужно сделать, чтобы фокус переходил на проводник ? |
| У меня сработал такой вызов: цитата: | // Using ShellExecute for opening Explorer with selected File ShellExecute( 0, "open", "explorer.exe", "/select," + cFileName, NIL, 1 ) |
| где cFileName := CurDrive() + ":\" + CurDir() + "\MyPicture.png"
|
|
|
|
| постоянный участник
|
Пост N: 7298
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.23 16:08. Заголовок: Да на простом пример..
Да на простом примере может и будет работать, только у меня не работает. Путь вот такой длинный: J:\Abonent4.Город\@Город-Sberbank\Export-2023\0156019111_10202810800190000111_200223.txt У меня на кнопках установлены вызовы других функций через блок кода, примерно так: cRunBlock := cRunFun + "( '"+cVal+"' ,'"+aObj[1]+"', '"+aObj[2]+"', '"+cWrtFld+"' )" bBlock := &("{||"+cRunBlock+"}") SetProperty(cForm, aObj[1], "OnLostFocus", bBlock) Причём вызовов несколько. Это как то может повлиять на сбой фокуса ?
|
|
|
|
| moderator
|
Пост N: 2102
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.02.23 16:16. Заголовок: Andrey пишет: Путь ..
Andrey пишет: Для таких случаев используй преобразование пути с помощью функции _GetShortPathName(): цитата: | cFileName := _GetShortPathName( cFileName ) |
|
|
|
|
|
| постоянный участник
|
Пост N: 7299
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.23 16:46. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Для таких случаев используй преобразование пути с помощью функции _GetShortPathName(): |
| Не помогает... Убрал русские буквы из пути. Думал что из диска J: подключённый через SUBST, но указание явно - тоже не работает, т.е. НЕ ВЫВОДИТ проводник на передний план рабочего стола компа, предыдущее модальное окно на переднем плане. cFile = F:\DISK_J\ABONENT4.City\@City-Sberbank\Export-2023\0156019111_10202810800190000111_200223.txt c2File= F:\DISK_J\ABONENT4.City\@City-Sberbank\Export-2023\0156019111_10202810800190000111_200223.txt Что можно сделать ?
|
|
|
|
| постоянный участник
|
Пост N: 4231
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.02.23 17:18. Заголовок: Andrey пишет Что мож..
Andrey пишет для excel ты делаешь hWnd := oExcel:hWnd // хендл окна Excel ShowWindow( hWnd, 6 ) // MINIMIZE windows ShowWindow( hWnd, 3 ) // MAXIMIZE windows BringWindowToTop( hWnd ) // a window on the foreground проделай для explorer.exe, поймав его hWnd через enumwindow() или через pid := ShellExcecuteEx(...) В hmg в примерах или lib был набор ф-й для pid (не могу вспомнить в данный момент) цитата: | предыдущее модальное окно на переднем плане |
| Сделай Minimaize этому окну, потом сделаешь Restore, возможно в нем Topmost сильно "заморозился"
|
|
|
|
| постоянный участник
|
Пост N: 7300
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.23 23:41. Заголовок: Пример C:\MiniGU..
Пример C:\MiniGUI\SAMPLES\Advanced\ShellExec При вызове кнопки видно, что окно Хелпа МиниГуи становится после окна программы МиниГуи !!! Эта же программа лежит собранная где-то в 2019 году - Хелпа МиниГуи на переднем плане.
|
|
|
|
| постоянный участник
|
Пост N: 4232
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.02.23 00:06. Заголовок: Andrey пишет Что не..
Andrey пишет цитата: | При вызове кнопки видно, что окно Хелпа МиниГуи становится после окна программы МиниГуи !!! |
| Что не ясно в примере и причем здесь год ? DEFINE WINDOW Win_1 ; AT 0,0 WIDTH 450 HEIGHT 300 ; TITLE "ShellExecuteEx() Using Demo" ; MAIN ; TOPMOST ; ON INIT This.Topmost := .F. ; FONT "Tahona" SIZE 14 ; NOMAXIMIZE NOSIZE ... ты в примерах всегда это пишешь (красным)
|
|
|
|
| постоянный участник
|
Пост N: 7301
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.02.23 00:13. Заголовок: SergKis пишет: Что ..
SergKis пишет: цитата: | Что не ясно в примере и причем здесь год ? |
| Блин, упустил из вида. Спасибо, понял !
|
|
|
|
| постоянный участник
|
Пост N: 7312
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.23 21:45. Заголовок: Как из PID процесса ..
Как из PID процесса можно получить хендл окна ? Т.е. при запуске: nPid := ShellExecuteEx( 0, "open", "explorer.exe", '/select, ' + cFile, , SW_SHOWNORMAL ) Получаю nPid, а как потом получить Хендл окна для изменения его ? hWin := ????? nPid cTitle := GetWindowText( hWin ) cTitle += ": " + cFileNoPath(cFile) SetWindowText( hWin, cTitle ) // меняем текст Title Видел это - http://clipper.borda.ru/?1-4-0-00001093-000-0-0-1438070443 Кто нибудь реализовал ?
|
|
|
|
| |
Пост N: 1885
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.03.23 08:59. Заголовок: Andrey пишет: Видел..
|
|
|
|
| постоянный участник
|
Пост N: 4237
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.23 10:37. Заголовок: Haz пишет А в чем сл..
Haz пишет цитата: | А в чем сложность протестировать ? |
| Что есть в hmg примерах - танцует от hWnd, т.е. для explorer.exe LOCAL cClass := "CabinetWClass" // класс окна explorer.exe ... nId := ShellExecuteEx( 0, "open", "explorer.exe", '/select, ' + cFile, , SW_SHOWNORMAL ) ... IF !Empty(nId) // запустился и прорисовался aWin := HandlesHbWin( , cClass, .T.) IF ( lRun := Len(aWin) > 0 ) i := 0 h := aWin[1] ? GetWindowThreadProcessId(h, @nThr, @nPid) // вернет Nil ?? i, h, nId, nPid, nThr ^^^ ^^^^ // разные значения Вопрос от Андрея и меня, как получить hWnd от nId ? Ведь из оной или разных программ может быть запущено несколько explorer.exe aWin := HandlesHbWin( , cClass, .T.) даст несколько hWnd. Пример тут https://TransFiles.ru/qyyji - внизу кнопка (1) запускает просмотр запущенного, на ней Reset - обновляет список, Excel запускается, в Reset видно - внизу кнопка (2) запускает explorer.exe с new Title и блокирует 2-ой запуск - внизу кнопка (3) останавливает explorer.exe с new Title - вверху кнопка 1) запускает explorer.exe (запустить можно несколько), тут вопрос и возникает (вверху) PS Мне хватало, на клиентской PC, помечать запущенную прогу, меняя title t := GetWindowText( h ) SetWindowText( h, t +": "+cFile ) // меняем текст Title У Андрея RDP есть и такая фишка может не прокатить, или на своем столе он увидит только свой explorer.exe
|
|
|
|
|
| |
Пост N: 1886
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.03.23 16:20. Заголовок: SergKis пишет: Вопр..
SergKis пишет: цитата: | Вопрос от Андрея и меня, как получить hWnd от nId ? |
| примерно так Func Test local hWnd := 0 local aWin := {} local hPid, hProcess hPID := hb_processOpen( "Explorer.exe /select," + cFile,,,,.F., @hProcess) aWin := EnumWindows() for each hWnd in aWin if hPID == GetWindowThreadProcessID(hWnd) // тут и hWnd и hPID и hProcess можно дополнительно указать титл "Проводник" и ClassName окна "Static" ЧТОБ КНОПКИ ОТСЕЧЬ ? hWnd , hPID, hProcess end END return nil НЕ ПРОВЕРЯЛ , позже
|
|
|
|
| |
Пост N: 1887
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.03.23 19:41. Заголовок: Haz пишет: НЕ ПРОВЕ..
Haz пишет: Проверил , EXPLORER так не выловить ! он как то хитро запускается что ID процесса не выдает корректно Любое другое приложение запускаясь ловится отлично
|
|
|
|
| постоянный участник
|
Пост N: 4238
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.23 22:28. Заголовок: Haz пишет Проверил ,..
Haz пишет цитата: | Проверил , EXPLORER так не выловить ! он как то хитро запускается что ID процесса не выдает корректно |
| Ерунда получается, ты прав. nId := ShellExecuteEx( 0, "open", aCmd[1], aCmd[2]+' '+aCmd[3], , SW_SHOWNORMAL ) DO EVENTS ; wApi_Sleep(1000) IF !Empty(nId) //hProc := hb_processOpen( "explorer.exe "+'/select, ' + cFile, , , , .F., @nPID ) hProc := hb_processOpen( cCmd, , , , .F., @nPID ) hb_processClose(hProc) aWin := HandlesHbWin( , cClass, .T.) // снимок ? procName(),cClass,nId,hProc,nPID, aWin FOR EACH hWnd IN aWin GetWindowThreadProcessID(hWnd, @nTread, @nProcID) ? hb_EnumIndex(hWnd), hWnd,nTread, nPID, nProcID NEXT ENDIF результат: 1-ый запуск 1 15729718 CabinetWClass _ShellExecute RUNEXPLORFILE2EX CabinetWClass 1516 912 11968 ARRAY[1] 2-ой запуск 1 15729718 12672 11968 6252 1 16516746 CabinetWClass _ShellExecute 2 15729718 CabinetWClass _ShellExecute RUNEXPLORFILE2EX CabinetWClass 900 1564 3936 ARRAY[2] 1 16516746 12652 3936 4356 2 15729718 12672 3936 6252 цитата: | Любое другое приложение запускаясь ловится отлично |
| Вернусь к своей схеме, проверена, работает ... aPos := HandlesHbWin( cFile, cClass, .T.) // снимок ДО для cFile, проверка 2-го запуска IF Len(aPos) > 0 ; RETURN .F. // уже есть такой ENDIF aOld := HandlesHbWin( , cClass, .T.) // снимок ДО nId := ShellExecuteEx( 0, "open", "explorer.exe", '/select,'+' '+cFile, , SW_SHOWNORMAL ) DO EVENTS ; wApi_Sleep(1000) // ждем прорисовки и форм. Title IF !Empty(nId) // запустилcя ok! aWin := HandlesHbWin( , cClass, .T.) // снимок ПОСЛЕ IF Len(aWin) > 1 FOR EACH hWnd IN aWin nPos := aScan(aOld, hWnd) IF ( lNew := nPos == 0 ) ; EXIT ENDIF NEXT ELSE lNew := .T. hWnd := aWin[1] ENDIF DO EVENTS ; wApi_Sleep(100) IF lNew i := 0 t := GetWindowText( hWnd ) SetWindowText( hWnd, t +": "+cFile ) // меняем текст Title DO EVENTS ; wApi_Sleep(100) WHILE !cFile $ GetWindowText( hWnd ) .and. i++ < 10 // проверяем Title SetWindowText( hWnd, t +": "+cFile ) DO EVENTS ; wApi_Sleep(100) END ENDIF ENDIF ...
|
|
|
|
| постоянный участник
|
Пост N: 7313
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.03.23 23:59. Заголовок: Haz пишет: Любое др..
Haz пишет: цитата: | Любое другое приложение запускаясь ловится отлично |
| Что-то у меня не получается... Покажи код как ловиться ?
|
|
|
|
| |
Пост N: 1889
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.03.23 12:41. Заголовок: Andrey пишет: Что-т..
Andrey пишет: цитата: | Что-то у меня не получается... Покажи код как ловиться ? |
| #include "common.ch" #include "i_winuser.ch" #include "hbthread.ch" Func Main local hWnd := 0 local aWin := {} local hPid, hProcess local nT, nP, cClassName hPID := hb_processOpen( "Notepad.exe",,,,.F., @hProcess) hb_idlesleep(1) aWin := EnumWindows() for each hWnd in aWin cClassName := GetClassName( hWnd ) if cClassName == "Notepad" GetWindowThreadProcessID(hWnd, @nT, @nP) if hProcess == nP ? "Вот оно окно , делай что хочешь hWnd = ", hWnd, cClassName end end END return nil
|
|
|
|
| |
Пост N: 1890
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.03.23 15:42. Заголовок: Сергей пишет: Ерунд..
Сергей пишет: цитата: | Ерунда получается, ты прав. |
| При попытке запуска EXPLORER.EXE управление передается SVCHOST и из него дочерним процессом запускается EXPLORER Поэтому hPID и nProcess имеют значения отличные от получаемых в hb_ProcessOpen() Попытка трассировки ProcessID и ParentProcessID ничего не дает и уходит в WinInit Остается только твой вариант - перед запуском снимок окон пользователя с Wnd.ClassName = 'CabinetWClass' и отлов нового после запуска.
|
|
|
|
| постоянный участник
|
Пост N: 7314
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.03.23 23:15. Заголовок: Haz пишет: if cClas..
Haz пишет: цитата: | if cClassName == "Notepad" GetWindowThreadProcessID(hWnd, @nT, @nP) if hProcess == nP ? "Вот оно окно , делай что хочешь hWnd = ", hWnd, cClassName end end |
| А если запущено уже несколько Notepad пользователем, то что будет ? Т.е. уже есть открытые Notepad и я запускаю свой. Хочу поменять титул окна, чтобы знать что это мой экземпляр и облом с этим действием. Рассматриваю Notepad в качестве примера.
|
|
|
|
| постоянный участник
|
Пост N: 4239
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.03.23 23:32. Заголовок: Andrey пишет Хочу по..
Andrey пишет цитата: | Хочу поменять титул окна, чтобы знать что это мой экземпляр и облом с этим действием. |
| Облома нет, все работает по схеме, как для explorer.exe выше, т.е. титул окна меняется Скрытый текст
FUNCTION StartNotepad(cFile, cCapt) LOCAL nId, aWin, hWnd, lNew, nPos, aPos, aOld, i, t LOCAL cClass := "Notepad" // класс окна DEFAULT cFile := ".\demo2.prg" DEFAULT cCapt := cFile aPos := HandlesHbWin( cCapt, cClass, .T.) // снимок ДО для cFile, проверка 2-го запуска IF Len(aPos) > 0 ; RETURN .F. // уже есть такой ENDIF aOld := HandlesHbWin( , cClass, .T.) // снимок ДО nId := ShellExecuteEx( 0, "open", "notepad.exe", cFile, , SW_SHOWNORMAL ) DO EVENTS ; wApi_Sleep(500) // ждем прорисовки и форм. Title IF !Empty(nId) // запустился ok! aWin := HandlesHbWin( , cClass, .T.) // снимок ПОСЛЕ IF Len(aWin) > 1 FOR EACH hWnd IN aWin nPos := aScan(aOld, hWnd) IF ( lNew := nPos == 0 ) ; EXIT ENDIF NEXT ELSE lNew := .T. hWnd := aWin[1] ENDIF DO EVENTS ; wApi_Sleep(100) IF lNew i := 0 t := GetWindowText( hWnd ) SetWindowText( hWnd, t + cCapt ) // меняем текст Title DO EVENTS ; wApi_Sleep(100) WHILE !cFile $ GetWindowText( hWnd ) .and. i++ < 10 // проверяем Title SetWindowText( hWnd, t + cCapt ) DO EVENTS ; wApi_Sleep(100) END ENDIF ENDIF RETURN .T. Вызов, например, такой StartNotepad(".\demo2.hbp", " - my start !")
|
|
|
|
|
| постоянный участник
|
Пост N: 7315
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.03.23 23:54. Заголовок: SergKis пишет: Обло..
SergKis пишет: цитата: | Облома нет, все работает по схеме, как для explorer.exe выше, т.е. титул окна меняется |
| Только что попробовал, вот результат - титул окна НЕ МЕНЯЕТСЯ : 1 526190 Notepad _a.txt – Блокнот 2 395100 Notepad _a4.txt – Блокнот 1 526190 Notepad _a.txt – Блокнот 2 395100 Notepad _a4.txt – Блокнот 1 329742 Notepad Demo2.hbp – Блокнот 2 526190 Notepad _a.txt – Блокнот 3 395100 Notepad _a4.txt – Блокнот ----- Вызов из: TEST_3(711) -> demo2.prg hProcessHandleShellExecuteEx= NIL
|
|
|
|
| постоянный участник
|
Пост 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
[только новые]
|
|