Перейти к содержимому

Фотография

Как узнать путь к папке, которая активна в данный момент времени?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1
gibson85

gibson85
  • Постоялец
  • 316 сообщений
Задача след.:
Я хочу написать прогу, которая по нажатию какой-нибудь комбинации клавиш, создавала "новую папку" в текущей директории (не той, в которой находится сама программа, а той, которая активна в данный момент времени). А вот как можно узнать путь этой текущей (активной) папке я не знаю. Подскажите пожалуйста.
___________
Допустим у меня сейчас открыта папка C:\Test, я нажимаю комбинацию клавиш, и в этой папке должна появиться "новая папка". Мне нужно определить путь "C:\Test", чтобы указать программе, что именно в ней должна создаваться новая папка.

PS: Папка окрывается в обычном проводнике Windows
  • 0

#2
TeXpert

TeXpert
  • Гость
  • 28 сообщений

PS: Папка окрывается в обычном проводнике Windows

Ты хоть хорошо подумал? Нет в Windows понятия "текущая папка", это не DOS! У тебя могут быть открыты куча папок, и что тогда?
  • 0

#3
RZ_RZ

RZ_RZ
  • Гость
  • 17 сообщений
Если стоит в настройках "показывать полный путь в строке заголовка" то мона прочитать это из заголовка, активного окна проводника.
  • 0

#4
gibson85

gibson85
  • Постоялец
  • 316 сообщений

Ты хоть хорошо подумал? Нет в Windows понятия "текущая папка", это не DOS! У тебя могут быть открыты куча папок, и что тогда?


Я же написал, что тогда будет нужно узнать путь "активной папки", которая будет иметь фокус. (Допустим мы открыли 3 папки, на одну из них кликнули мышкой, она получила фокус, ей путь нужно узнать).




Если стоит в настройках "показывать полный путь в строке заголовка" то мона прочитать это из заголовка, активного окна проводника.


Вот, вот, как раз этого я и добиваюсь! Как это сделать, подскажите.

Я "пытался" кое что набросать :
var
  WindowName: Pchar;
  f, f1, t:hwnd;
  textLength: integer;
begin
 если нажата определённая комбинация клавиш, то
	   begin;
   	f:= FindWindow('CabinetWClass', nil);
	f1:=FindWindowEx(f,0, nil, WindowName);
		textLength:= GetWindowTextLength(f1);
		GetWindowText(f1, WindowName, textLength );
		ShowMessage(WindowName);
	   end;
end;

При выполнении этого кода, в окне ShowMessage выдаются "два кубика". А можно ли как-нибудь "конвертировать" WindowName из Pchar в обычный String, чтобы название окна нормально отображалось в ShowMessage? Или вообще переделать весь код? У кого какие идеи (с примером если не трудно)!
  • 0

#5
resurected_timofei

resurected_timofei
  • Завсегдатай
  • 139 сообщений
А цель то какая? =) Просто сделай хоткей для создания новой папки? =)
  • 0

#6
Вини

Вини
  • В доску свой
  • 2 542 сообщений
Да сдается мне цель тут вирь написать
  • 0

#7
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений
Есть функция GetForegroundWindow, которая возвращает активное окно.
Каким то образом можно узнать, какому процессу принадлежит это окно.
Каким то образом можно узнать Current Directory процесса. Я конечно не ручаюсь, но с большой вероятностью это и будет та папка, которая отображается.

Как конкретно сделать - ищите в MSDN-е.
  • 0

#8
gibson85

gibson85
  • Постоялец
  • 316 сообщений

А цель то какая? =) Просто сделай хоткей для создания новой папки? =)

Да.

Да сдается мне цель тут вирь написать

Нет. Впрочем не в этом вопрос состоял.


Есть функция GetForegroundWindow, которая возвращает активное окно.

Я её задействовал (см. код)

Каким то образом можно узнать, какому процессу принадлежит это окно.
Каким то образом можно узнать Current Directory процесса. Я конечно не ручаюсь, но с большой вероятностью это и будет та папка, которая отображается.

Не то что-то.


var
  WindowName: Pchar;
  f, f1, t:hwnd;
  textLength: integer;
begin
если нажата определённая комбинация клавиш, то
	begin;
		f:= getForegroundWindow;   
	f1:=FindWindowEx(f,0, nil, WindowName);
		  textLength:= GetWindowTextLength(f1);
		  GetWindowText(f1, WindowName, textLength );
			Label1.Caption:=(WindowName);
			Label2.Caption:=(PChar(WindowName)); //на всякий случай
			Label3.Caption:=(PWideChar(WindowName)); //на всякий случай
	end;
end;

Нужно устранить кракозябы, которые отображаются вместо нормального пути.
  • 0

#9
TeXpert

TeXpert
  • Гость
  • 28 сообщений

Я же написал, что тогда будет нужно узнать путь "активной папки", которая будет иметь фокус. (Допустим мы открыли 3 папки, на одну из них кликнули мышкой, она получила фокус, ей путь нужно узнать).

Копай интерфейс IShellFolder, и будет тебе счастье. Там есть методы. Сходи на MSDN, да будет Гугл тебе в помощь:mad:).
  • 0

#10
TeXpert

TeXpert
  • Гость
  • 28 сообщений
А потом, зачем мудришь лишними вызовами?
GetForegroundWindow возвращает описатель окна, скорми его GetWindowText. И зачем вызывать FindWindow?
Хотя, если мне память не изменяет, всё это не будет работать. То есть, с другого процесса просто так не извлечь, смотри в MSDN и Рихтере.

Сообщение отредактировал TeXpert: 21.01.2007, 04:40:46

  • 0

#11
TeXpert

TeXpert
  • Гость
  • 28 сообщений

Каким то образом можно узнать, какому процессу принадлежит это окно.

А что гадать? Процесс этот -- Explorer.

Каким то образом можно узнать Current Directory процесса. Я конечно не ручаюсь, но с большой вероятностью это и будет та папка, которая отображается.

Не будет.
  • 0

#12
gibson85

gibson85
  • Постоялец
  • 316 сообщений

А потом, зачем мудришь лишними вызовами?
GetForegroundWindow возвращает описатель окна, скорми его GetWindowText. И зачем вызывать FindWindow?
Хотя, если мне память не изменяет, всё это не будет работать.


Всё правильно говорите, я немного сглупил.
Всё, наконец-то я нашел в инете примерчик и сделал всё как надо! Огромное спасибо всем кто принимал участие в дискуссии.
  • 0

#13
Sir666

Sir666
  • В доску свой
  • 2 367 сообщений
Народ реально парню помойму было бы достаточно GetCurrentDir() и SetCurrentDir()
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.