Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 7 (http://forum.oszone.net/forumdisplay.php?f=95)
-   -   Копирование пути к файлу с помощью горячих клавиш (http://forum.oszone.net/showthread.php?t=231659)

garynich 30-03-2012 10:10 1889824

Копирование пути к файлу с помощью горячих клавиш
 
Всем доброго времени суток.
Собственно САБЖ: как копировать путь к файлу с помощью горячих клавиш и можно ли их заменить на свои? Про shift+пкм я знаю, но данный вариант мне абсолютно не подходит - слишком много мароки будет в будущем.
Заранее спасибо за ответ...

Morpheus 30-03-2012 10:33 1889839

garynich, можно без Shift сделать - http://forum.oszone.net/post-1555548.html#post1555548

garynich 30-03-2012 11:10 1889869

Morpheus, спасибо, я этот вариант уже рассматривал, но для меня он не подходит. Данный путь будет использован в другой программе, поэтому мне легче эмулировать нажатие, чем долбаться с нажатием кнопок мыши.

Dzirt2005 30-03-2012 11:34 1889889

garynich, по Ctrl+C в буфер обмена копируется полное имя файла (если выделено несколько, то каждое имя с новой строки). Единственное замеченное отличие от Shift+ПКМ - имена файлов не обрамлены кавычками

Morpheus 30-03-2012 11:45 1889903

garynich, сомневаюсь, что хотелка реализуема.
Dzirt2005, по Ctrl+C копируется сам файл, а не его имя.

Dzirt2005 30-03-2012 11:56 1889909

Morpheus, по Ctrl+C _файл_ не копируется - это легко проверить нажав Ctrl+C на каком-нибудь файле размером гигов в 50 :) Вы же не думаете, что все 50 гигов мгновенно скопировались в ОЗУ и при этом занимаемая память не увеличилась? Или например "скопировать" pagefile.sys или любой другой к которому нет доступа - он ведь не мог скопироваться? Тогда откуда в буфере обмена его имя?

Копируются управляющие структуры для того, чтобы можно было в дальнейшем скопировать файл, а имена файлов просто присутствуют как текст. Реальное копирование произойдет при нажатии Ctrl+V.

Можно просто скачать какой-нибудь просмотрщик буфера обмена(например, Free Clipboard Viewer) и посмотреть что будет в буфере обмена при копировании в него разнообразных данных.

Morpheus 30-03-2012 12:00 1889913

Dzirt2005, нажмите на файле Ctrl+C и попробуйте вставить в командую строку, например. Работает?

Dzirt2005 30-03-2012 12:06 1889923

Вложений: 1
Morpheus, не в командную строку, а в любой текстовый редактор. Да, естественно работает. С чего бы ему не работать? Хотя конечно я проверял в Far'е (и в командной строке и в его текстовом редакторе), может в этом дело. Но имя файла в буфере обмена есть (см. приложенный скриншот).

PS: Хотя возможно дело в том, что по Ctrl+C в буфере обмена не записываются данные с типом CF_TEXT (или CF_UNICODETEXT) в дополнение к другим данным. Это уже минус Майкрософту, могли бы и сделать... Вечно им лень. Наверное, все программисты в Майкрософте работают исключительно мышкой :)

Morpheus 30-03-2012 12:10 1889927

Цитата:

Цитата Dzirt2005
в любой текстовый редактор. »

Блокнот есть? :)
Цитата:

Цитата Dzirt2005
Но имя файла в буфере обмена есть (см. приложенный скриншот). »

Ага, осталось научиться работать с этой бесценной информацией.

Dzirt2005 30-03-2012 12:56 1889963

Morpheus,

Цитата:

Цитата Morpheus
Блокнот есть? »

Есть, в него не вставляет, потому что:
Цитата:

Цитата Dzirt2005
PS: Хотя возможно дело в том, что по Ctrl+C в буфере обмена не записываются данные с типом CF_TEXT (или CF_UNICODETEXT) в дополнение к другим данным. Это уже минус Майкрософту, могли бы и сделать... Вечно им лень. Наверное, все программисты в Майкрософте работают исключительно мышкой »

В текстовый редактор Far'а замечательно вставляет. Видимо, разработчики Far'а не настолько ленивы, как программисты MS, за что им честь и хвала!

Цитата:

Цитата Morpheus
Ага, осталось научиться работать с этой бесценной информацией. »

Цитата:

Цитата garynich
Данный путь будет использован в другой программе »

Какие проблемы программно достать путь из буфера обмена?

Morpheus 30-03-2012 13:08 1889970

Цитата:

Цитата Dzirt2005
Это уже минус Майкрософту, могли бы и сделать... Вечно им лень. »

Точно! А ещё блокнот должен показывать фильмы в HD качестве :)

Цитата:

Цитата Dzirt2005
Какие проблемы программно достать путь из буфера обмена? »

Спросим у автора темы, может ли он научить программу вычленять из кучи хлама нужное?

garynich 30-03-2012 13:29 1889983

Цитата:

Цитата Dzirt2005
Какие проблемы программно достать путь из буфера обмена? »

Никто и не говорил, что проблемы здесь...
С Ctrl+C у меня тоже ничего не получается. Использую NotePad++, в него название не вставляется.

Цитата:

Цитата Morpheus
garynich, сомневаюсь, что хотелка реализуема. »

Я программист, поэтому у нас все реализуется, просто отличается количество затраченных ресурсов.

Dzirt2005 30-03-2012 15:00 1890050

Цитата:

Цитата garynich
С Ctrl+C у меня тоже ничего не получается. Использую NotePad++, в него название не вставляется. »

Я же уже написал, что не вставится и написал почему не вставится. Программистам Майкрософта было лень наряду с другими данными вставить в буфер обмена данные с форматом CF_UNICODETEXT. Но программно не составит труда проверить и если есть, то получить данные из формата CF_HDROP. Примерно таким способом (неужели я отвечаю программисту?):
читать дальше »
Код:

HANDLE Clipboard::GetData(UINT uFormat)
{
        if (UseInternalClipboard)
        {
                if (InternalClipboardOpen)
                {
                        for (size_t I=0; I < ARRAYSIZE(hInternalClipboard); ++I)
                        {
                                if (uInternalClipboardFormat[i] != 0xFFFF && uInternalClipboardFormat[i] == uFormat)
                                {
                                        return hInternalClipboard[i];
                                }
                        }
                }

                return (HANDLE)nullptr;
        }

        return GetClipboardData(uFormat);
}


...
            hClipData=GetData(CF_HDROP);
                if (hClipData)
                {
                        LPDROPFILES Files=reinterpret_cast<LPDROPFILES>(GlobalLock(hClipData));
                        if (Files)
                        {
                                LPCSTR StartA=reinterpret_cast<LPCSTR>(Files)+Files->pFiles;
                                LPCWSTR Start=reinterpret_cast<LPCWSTR>(StartA);
                                string strClipText;
                                if(Files->fWide)
                                {
                                        while(*Start)
                                        {
                                                size_t l1=strClipText.GetLength();
                                                strClipText+=Start;
                                                Start+=strClipText.GetLength()-l1;
                                                Start++;
                                                if(*Start)
                                                {
                                                        strClipText+=L"\r\n";
                                                }
                                        }
                                }
                                else
                                {
                                        while(*StartA)
                                        {
                                                size_t l1=strClipText.GetLength();
                                                strClipText+=StartA;
                                                StartA+=strClipText.GetLength()-l1;
                                                StartA++;
                                                if(*StartA)
                                                {
                                                        strClipText+=L"\r\n";
                                                }
                                        }
                                }
                                if(!strClipText.IsEmpty())
                                {
                                        ClipText=reinterpret_cast<LPWSTR>(xf_malloc((strClipText.GetLength()+1)*sizeof(WCHAR)));
                                        wcscpy(ClipText, strClipText);
                                }
                                GlobalUnlock(hClipData);
                        }
                }
...



Цитата:

Цитата Morpheus
Спросим у автора темы, может ли он научить программу вычленять из кучи хлама нужное? »

Ээээ... А я думал, что программистам из MS было просто лень, а оказывается они мастера накидать кучу хлама! Среди которого трудно найти что-то нужное, да? :yes:

Может завяжем уже с упражнениями в остроумии? Блокнот не должен воспроизводить фильмы в HD качестве, к Блокноту вообще никаких претензий. Претензии к тому программисту, который делал копирование данных в буфер обмена при нажатии Ctrl+C из Explorer'а. Могли бы еще добавить и простой текстовый список файлов, было бы удобнее. Но не подумали/поленились/решили что оно никому не надо...


Время: 11:28.

Время: 11:28.
© OSzone.net 2001-