On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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"

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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)

Причём вызовов несколько. Это как то может повлиять на сбой фокуса ?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2102
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.02.23 16:16. Заголовок: Andrey пишет: Путь ..


Andrey пишет:

 цитата:
Путь вот такой длинный


Для таких случаев используй преобразование пути с помощью функции _GetShortPathName():


 цитата:
cFileName := _GetShortPathName( cFileName )




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Что можно сделать ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 сильно "заморозился"

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7300
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.02.23 23:41. Заголовок: Пример C:\MiniGU..


Пример C:\MiniGUI\SAMPLES\Advanced\ShellExec
При вызове кнопки видно, что окно Хелпа МиниГуи становится после окна программы МиниГуи !!!
Эта же программа лежит собранная где-то в 2019 году - Хелпа МиниГуи на переднем плане.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
...

ты в примерах всегда это пишешь (красным)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7301
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.02.23 00:13. Заголовок: SergKis пишет: Что ..


SergKis пишет:

 цитата:
Что не ясно в примере и причем здесь год ?


Блин, упустил из вида. Спасибо, понял !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
Кто нибудь реализовал ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1885
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.03.23 08:59. Заголовок: Andrey пишет: Видел..


Andrey пишет:

 цитата:
Видел это - http://clipper.borda.ru/?1-4-0-00001093-000-0-0-1438070443
Кто нибудь реализовал ?


Реализовывал лет 5 назад, только обратную задачу по окну найти процесс, все работает. А в чем сложность протестировать ? там не более 10 строк кода будет всего.
Учти только что у одного процесса может быть много окон ( кнопки, к примеру, это тоже окна )
https://learn.microsoft.com/en-us/windows/win32/winmsg/about-window-classes

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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




НЕ ПРОВЕРЯЛ , позже

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1887
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.03.23 19:41. Заголовок: Haz пишет: НЕ ПРОВЕ..


Haz пишет:

 цитата:
НЕ ПРОВЕРЯЛ , позже


Проверил , EXPLORER так не выловить ! он как то хитро запускается что ID процесса не выдает корректно
Любое другое приложение запускаясь ловится отлично

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7313
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.03.23 23:59. Заголовок: Haz пишет: Любое др..


Haz пишет:

 цитата:
Любое другое приложение запускаясь ловится отлично


Что-то у меня не получается...
Покажи код как ловиться ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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




Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1890
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.03.23 15:42. Заголовок: Сергей пишет: Ерунд..


Сергей пишет:

 цитата:
Ерунда получается, ты прав.


При попытке запуска EXPLORER.EXE управление передается SVCHOST и из него дочерним процессом запускается EXPLORER
Поэтому hPID и nProcess имеют значения отличные от получаемых в hb_ProcessOpen()
Попытка трассировки ProcessID и ParentProcessID ничего не дает и уходит в WinInit

Остается только твой вариант - перед запуском снимок окон пользователя с Wnd.ClassName = 'CabinetWClass' и отлов нового после запуска.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 в качестве примера.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4239
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.03.23 23:32. Заголовок: Andrey пишет Хочу по..


Andrey пишет
 цитата:
Хочу поменять титул окна, чтобы знать что это мой экземпляр и облом с этим действием.


Облома нет, все работает по схеме, как для explorer.exe выше, т.е. титул окна меняется
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1891
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.03.23 09:10. Заголовок: Andrey пишет: А есл..


Andrey пишет:

 цитата:
А если запущено уже несколько Notepad пользователем, то что будет ?



а что будет результатом такой проверки ?
 
GetWindowThreadProcessID(hWnd, @nT, @nP)
if hProcess == nP
? "Вот оно окно , делай что хочешь hWnd = ", hWnd, cClassName
end


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() говорит лишь о том, что запуск произошел или нет.
Это ремарка

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1892
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.03.23 10:05. Заголовок: Дарю решение в одну строку, но без Титла


все просто , на передний план, но без hWhd И соответственно без операций с окном ( титлы, размер и пр )
 
SetForegroundWindow(GetDesktopWindow())
hPID := hb_processOpen( "explorer.exe /select," + cFile,,,,.F., @hProcess) // откроет explorer на переднем плане окон
// Дальше по тексту
//



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 еще делать до того.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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) сняты. Спасибо

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7316
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.03.23 23:12. Заголовок: А как можно узнать п..


А как можно узнать по хендлу полный путь запущенной программы ?
Поискал в примерах, но там что-то непонятно как это делается...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1894
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.03.23 23:20. Заголовок: Andrey пишет: как м..


Andrey пишет:

 цитата:
как можно узнать по хендлу полный путь запущенной программы


По хендлу чего ? Окна ? Процесса ?
Если процесса, самый простой путь через wmi
Select * from win32_process .
Если хендлу окна, то сначала ищем процесс (как выше писали ) , а потом пять wmi

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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' непонятно кому принадлежит ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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'



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7318
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.03.23 10:02. Заголовок: Т.е. нажатая кнопка ..


Т.е. нажатая кнопка на форме тоже отображается в процессах ?
Другие кнопки не показываются.
Фигня какая то получается.
А почему стандартный проводник этого не отображает ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1895
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.03.23 13:08. Заголовок: Andrey пишет: прово..


Andrey пишет:

 цитата:
проводнике по другому, ну это понятно.

в диспетчере задач не тот хендл указан , нуля не хватает

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7319
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.03.23 16:43. Заголовок: Haz пишет: нуля не ..


Haz пишет:

 цитата:
нуля не хватает


Проглядел...

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 34 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 86
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет