purebasic.info

PureBasic forum
Текущее время: Пн апр 23, 2018 8:14 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 73 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Контекстное меню файлов
СообщениеДобавлено: Пт дек 28, 2007 11:01 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6246
Благодарил (а): 17 раз.
Поблагодарили: 182 раз.
Пункты репутации: 48
Сегодня понадобилось чтоб моя программа создавала контекстное меню для файлов. Ну все видели, что если в проводнике кликнуть по любому файлу правой кнопкой мыши, то открывается меню ( к стати и в ТоталКоммандоре тоже самое). Многие программы добавляют туда свои пункты. К примеру архиваторы или антивирусы.
Мне тоже надо было научить свою программу так.
Поискал инфу - только общее описание нашёл. Пришлось самому написать код. Может кому надо тоже? К примеру, подойдет Петру для его текстового редактора.
Ну и для примера написал как енто дело использовать с пользой дела.
Вот очень полезная программка получилась. Она умеет создавать описания к файлам. Обычно в варёзных архивах есть файлы с расширением .nfo - краткое описание.

Так вот эта программулька, если ей разрешить, создаст контекстное меню "Создать NFO", выбрав которое автоматически будет создан в той же папке файл с таким же именем как и оригинал, но с расширением .nfo и он откроется в блокноте для заполнения описания. Потом просто сохраняете файл и всё.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 
 
; Важно!!!
;1.Имя откомпилированного файла должно быть "CreateNfo.exe"!!! Или отредактируйте строку с вызовом ContextMenuCreate("Создать NFO","CreateNfo.exe",#True)
;2.Под отладчиком "Создать контекстное меню" не активировать!!! А то там название программы exe не правильное...
 
SelectedFile$ = ProgramParameter()
 
Procedure ContextMenuCreate(MenuCommand.s,ProgrammCommand.s,State.b)
;MenuCommand - Так будет называться пункт в контекстном меню
;ProgrammCommand - Это имя скомпилированной вашей программы
 
ProgrammCommand = GetCurrentDirectory() + ProgrammCommand
If State=#True
    ProcedureReturn
RegCreateKeyValue("HKEY_CLASSES_ROOT\*\Shell\"+MenuCommand+"\command","",Chr(34)+ProgrammCommand+Chr(34)+" "+Chr(34)+"%1"+Chr(34),#REG_SZ,".")
Else
   ProcedureReturn RegDeleteKeyWithAllSub("HKEY_CLASSES_ROOT\*\Shell\"+MenuCommand,".")
 
EndIf
 
EndProcedure
 
 
Enumeration
  #Window_0
EndEnumeration
 
;{ Gadgets
Enumeration
  #TextGadget_0
EndEnumeration
;}
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 434, 276, 284, 169, "NFO File Create", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#TextGadget_0, 30, 125, 225, 25, "kvitaliy 2007", #PB_Text_Center)
      If CreateMenu(0, WindowID(#Window_0))
    MenuTitle("Файл")
      MenuItem( 1, "&Открыть Файл")
      MenuItem( 2, "Создать контекстное меню")
      MenuItem( 6, "Удалить контекстное меню")
      MenuBar()
      MenuItem(5,"Выход")
    MenuTitle("Помощь")
       MenuItem(3, "Помощь")
       MenuItem(4, "О программе")
  EndIf
 
    EndIf
  EndIf
EndProcedure
 
If SelectedFile$<>""
input$ =  SelectedFile$
out$   = ReplaceString(input$, "." + GetExtensionPart(input$), "." + "nfo")
If CreateFile(0, out$)
   CloseFile(0)
   RunProgram("notepad.exe",out$,"")
   EndIf
   End
Else
OpenWindow_Window_0()
EndIf
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
 
   Case #PB_Event_Menu
 
        Select EventMenu()  ;
          Case 1
          StandardFile$ = "C:\"  
          Pattern$ = "All files (*.*)|*.*"
          Pattern = 0    
          File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
           If File$
             input$ =  File$
              out$   = ReplaceString(input$, "." + GetExtensionPart(input$), "." + "nfo")
   
                 If CreateFile(0, out$)
                    CloseFile(0)
                    RunProgram("notepad.exe",out$,"")
                 EndIf
                 Else
                    MessageRequester("Information", "The requester was canceled.", 0)
                 EndIf
 
         
          Case 2
          If ContextMenuCreate("Создать NFO","CreateNfo.exe",#True); #True - значит создать пункт меню
             MessageRequester("Info", "Context Menu Created!", 0)
          EndIf
         
          Case 6
          If ContextMenuCreate("Создать NFO","CreateNfo.exe",#False); #False - значит удалить пункт меню
             MessageRequester("Info", "Context Menu Deleted!", 0)
          EndIf
           
          Case 4 ; About
            MessageRequester("About", "NFO File Create", 0)
           
          Default
            MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)
 
        EndSelect
 
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #TextGadget_0
      EndIf
    ; //////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        Break
      EndIf
  EndSelect
ForEver
;}
 



Последний раз редактировалось kvitaliy Ср дек 02, 2009 1:17 pm, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 5:33 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
У меня почему то если в пути файла стоят пробелы, то файл создается на диске С:\
То есть C:\Documents and Settings
Строка режется до C:\Documents и создается файл с неизвестным разрешением. А вот если путь C:\1111 то все нормально:
рядом с файлом как и задумывалось создается файл .NF0
Хотелось бы узнать это только у меня или у всех. Если у всех, то как получить полный путь к файлу?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 5:50 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Путь надо передавать в кавычках, т. е. "C:\Documents and Settings"

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 6:17 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Путь надо передавать в кавычках, т. е. "C:\Documents and Settings"

Дорогой Петр!
Про это я конечно знаю, ты просто не понял сути вопроса.
Если я вызываю контекстное меню в папке "С:\Dok rt" то возникает проблема описанная выше. То есть результат кода:
input$ = SelectedFile$ будет "С:\Dok"
Если в "С:\Dokrt"(путь без пробелов) то программа работает правильно. Понять не могу почему. Глюк компилятора? Системы?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 6:22 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
походу пробелы надо заменять на Chr() с кодом пробела. только я не помню код :) получится типа:
"C:\Documents" + Chr(*) + "and" + Chr(*) + "Settings" вместо звездочки код этого пробела надо... гдето тут на форуме было расписано какой символ = какой код.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 6:32 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Чтобы не парится с кодами символов, эти символы нужно просто заключать в одиночные кавычки, т. е. "C:\Documents" + ' '+ "and" + ' ' + "Settings"

Код:
1
Debug ' '



haav писал(а):
Про это я конечно знаю, ты просто не понял сути вопроса.
Да всё я понял, вот прочитай эту тему, там как раз про командную строку написанно http://purebasic.info/phpBB2/viewtopic. ... EA%E0#8815

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 6:32 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Да что же я такой тупой, не могу вам суть объяснить доходчиво :(
Вот отрывок кода:
Код:
1
2
3
If SelectedFile$<>""   ;если чему то равно то
input$ =  SelectedFile$        ;получаем параметр, то есть путь к файлу
out$   = ReplaceString(input$, "." + GetExtensionPart(input$), "." + "nfo") ;переписываем строку как надо



Как мне здесь заменять пробелы?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 6:56 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
Код:
1
2
input$ = GetPathPart(SelectedFile$)         ;получаем параметр, то есть путь к файлу 
Debug input$



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 7:06 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
У меня с этим кодом вообще не работает(то есть файл NF0) не создается


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 7:11 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
так это я тебе путь до файла показывал.
вобще что в этом инфо должно быть?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
 
 
If SelectedFile$<>""   ;если чему то равно то
input$ = GetPathPart(SelectedFile$)         ;получаем параметр, то есть путь к файлу
 
If CreateFile(0, input$ + "название.NFO")
WriteStringN(0, "bla bla bla...")
CloseFile(0)
EndIf
 
EndIf
 


упс... там лишнее :) убрал.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 7:26 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Дорогой друг!
Я уже сейчас в дурдом попаду.
Код:
1
2
3
4
5
SelectedFile$ = "D:\test folder\defaultPerfLog.txt"  
Посмотри вверху код:
Там как раз имя файла заранее неизвестно
 
 


Просто скомпили прогу kvitaliy, создай запись в реестре и попробуй через контекстное меню Windows создать файл nf0/ рядом с файлом в папке к примеру d:\55 55
Или я вообще ничего не понимаю :shock:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 8:18 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
ясно. я думал путь тебе известен. поэтому от фонаря написал свой.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 8:31 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
у тебя проблемы не с пробелом, а с путем. он изначально в SelectedFile$ уже пишет без пробела.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 8:46 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вот в этом изначально и был мой вопрос :D
Как сделать, чтобы SelectedFile$ = ProgramParameter()
выдавал бы правильный путь


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 8:52 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1608
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
вобщем как сказал Петр - ставь кавычки и будет тебе щастье :)

Код:
1
2
 
ProcedureReturn RegCreateKeyValue("HKEY_CLASSES_ROOT\*\Shell\"+MenuCommand+"\command","",Chr(34)+ProgrammCommand+Chr(34)+" "+Chr(34)+"%1"+Chr(34),#REG_SZ,".")



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 73 ]  На страницу 1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB