Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2009, 04:55   #1
Veiron
Форумчанин
 
Аватар для Veiron
 
Регистрация: 01.12.2007
Сообщений: 346
По умолчанию Путь к файлу по хэндлу окна

Есть открытое окно, нужно найти путь к его исполняемому файлу.
Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru
Veiron вне форума Ответить с цитированием
Старый 21.05.2009, 09:12   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Код:
GetModuleName(GetClassLong(handle,GCL_HMODULE));
Результат этой функции как раз полый путь и имя файла handle которого ты передаешь ей в параметре, если оставить все как есть - то она вернет путь к твоей программе как при ParamStr(0) ....
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 21.05.2009, 09:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Есть открытое окно
Любой программы? Или чисто твоей?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2009, 19:08   #4
Veiron
Форумчанин
 
Аватар для Veiron
 
Регистрация: 01.12.2007
Сообщений: 346
По умолчанию

Да, к любой. Предпологаемое начало кода:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
    H : HWND;
begin
  H := FindWindow(nil, Pchar(Edit1.Text));
  Label1.Caption := …
Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru
Veiron вне форума Ответить с цитированием
Старый 21.05.2009, 19:19   #5
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Код:
var
  GCL,DW,StrAddr,NumWriteRead:Cardinal;
  OFPCommandLineA:string;
  ProcessId, HandleWindow : DWord;
begin
GetWindowThreadProcessId(FindWindow(nil, 'Unit1.pas'), @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
                                    If HandleWindow<>0 then
                                        begin
                                            GCL:=Cardinal(GetProcAddress(GetModuleHandle('kernel32.dll'),'GetCommandLineA'));
                                            if GCL<>0 then
                                                begin
                                                    if ReadProcessMemory(HandleWindow,Pointer(GCL+1),@DW,4,NumWriteRead)and(NumWriteRead=4)and
                                                    ReadProcessMemory(HandleWindow,Pointer(DW),@StrAddr,4,NumWriteRead)and(NumWriteRead=4) then
                                                        begin
                                                            SetString(OFPCommandLineA, nil, MAX_PATH);
                                                                if ReadProcessMemory(HandleWindow,Pointer(StrAddr),@OFPCommandLineA[1],Length(OFPCommandLineA),NumWriteRead) then
                                                                    SetLength(OFPCommandLineA,Pos(#0,OFPCommandLineA)-1)
                                                                else
                                                                    OFPCommandLineA:='';
                                                        end;
                                                end;
                                            CloseHandle(HandleWindow);
                                        end;
  ShowMessage(OFPCommandLineA);
© Google + Copy/Paste
Ring0Sn вне форума Ответить с цитированием
Старый 21.05.2009, 19:28   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Можете сделать так:
Код:
Uses
   TLHelp32;
Function HandleToFullPath(H: HWND): String;
Var
Pid:Cardinal;
M: TModuleEntry32;
HSnapshot: THandle;
Begin
Result:='';
GetWindowThreadProcessId(H,@Pid);
HSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);
If HSnapshot=-1 Then
Exit;
M.DwSize:=SizeOf(TModuleEntry32);
If Module32First(HSnapshot,M) Then
Result:=M.SzExePath;
CloseHandle(HSnapshot);
End;
Procedure TForm1.Button1Click(Sender: TObject);
Var
H: HWND;
Begin
H:=FindWindow(Nil,'Program manager');
Label1.Caption:=HandleToFullPath(H);
End;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 21.05.2009, 19:41   #7
Veiron
Форумчанин
 
Аватар для Veiron
 
Регистрация: 01.12.2007
Сообщений: 346
По умолчанию

1й вариант может определить путь только к собственному файлу.

2й мегавариант либо не выводит ни чего, либо (если указать заголовок собственного окна) без коментариев:



Что по сути еще более не подходящий вариант чем первый...

Google почти час мучал, думал, что вопрос довольно распространенный, оказалось не очень, нашлось только на Си и Васик.
Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru
Veiron вне форума Ответить с цитированием
Старый 21.05.2009, 19:49   #8
Veiron
Форумчанин
 
Аватар для Veiron
 
Регистрация: 01.12.2007
Сообщений: 346
По умолчанию

Terran
Получилось аналогично первому варианту от Kotofff, прописывает путь только к самому себе. Сейчас попробую в другой ОС на немного другой Delphi.
Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru
Veiron вне форума Ответить с цитированием
Старый 21.05.2009, 19:53   #9
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
Terran
Получилось аналогично первому варианту от Kotofff, прописывает путь только к самому себе
Я код из поста №6 проверял. Всё работает замечательно и на своём приложении и на других тоже.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 22.05.2009, 13:26   #10
Veiron
Форумчанин
 
Аватар для Veiron
 
Регистрация: 01.12.2007
Сообщений: 346
По умолчанию

В общем Лицензионный WinServer 2008 + Пиратская Delphi 2009 не гут, а вот Пиратская WinVista + Лицензионный Delphi 2009 самое то. Спасибо заработало. Теперь попытаюсь разобратся, может что лишнее есть.
Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru
Veiron вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Путь к файлу artemavd Общие вопросы Delphi 12 24.03.2009 14:09
Путь к файлу Slash Общие вопросы Delphi 3 27.11.2008 14:02
Путь к файлу Баламут Win Api 12 14.05.2008 13:27
Путь к файлу Terran Общие вопросы Delphi 3 13.04.2008 01:18
Путь к файлу Лубышев Общие вопросы Delphi 2 10.02.2008 21:13