PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка


Вопросы новичка

Сообщений 121 страница 150 из 1000

121

Пётр написал(а):

А что делать собираешся?

Игра Президент. А рулетка, покер, биржа три способа добычи денег, для того чтобы стать президентом. Покер и рулетка готовы. Осталось биржу замутить. Но управлять будет главное окно:
http://s51.radikal.ru/i131/1003/d1/54e5b298a2d0.jpg

Основной код конечно еще не писал, но это уже в конце. когда определюсь как связать четыре EXE

0

122

А почему не засунуть все 4 игры в один EXE?

0

123

Пётр написал(а):

Ну не так всё гиморно как кажется.Можно через командную строку передать указатель на структуру, с помощью ReadProcessMemory скопировать структуру в свой процесс, изменить данные, а затем, отправить обратно с помощью WriteProcessMemory.

Я просто не понимаю, что за адреса выдает:

a.s="999"
Debug @a

0

124

Пётр написал(а):

А почему не засунуть все 4 игры в один EXE?

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

0

125

haav написал(а):

Я просто не понимаю, что за адреса выдает

Это указатель на начальную область памяти, занимаемую переменной.

Код:
a.s="999"
Debug PeekS(@a)
x.l=1234
Debug PeekL(@x)

0

126

Пётр написал(а):

Это указатель на начальную область памяти, занимаемую переменной.

Это я понял, но ты видел адрес в debug из моего примера?

адреса программ на пурике если их не паковать ничем начинаются с 00401000 и в нашем маленьком примере код будет находится не далее 00402000, то есть ограничится размером одной секции. Ну а переменные где то в области 00405000.  А ты посмотри что выдает DEBUG:  3737192   Это как понимать?

Разве WriteProcessMemory  примет такой адрес?

Отредактировано haav (20.03.2010 20:40:35)

0

127

haav написал(а):

Ну а переменные где то в области 00405000.  А ты посмотри что выдает DEBUG:  3737192   Это как понимать?

Не путай адрес асм. инструкции, работающей с переменной и её адрес в памяти.
Это разные вещи!
Функция WriteProcessMemory должна работать с такими адресами.

0

128

Петр! А как послать три параметра через командную строку? Ведь в моем случае надо посылать проге PID, BaseAddress, сумма денег.  Можно конечно  PID узнать потом, но все равно минимум два параметра посылать надо. Указатель на структуру посылать нельзя, опять ругань операционки будет. Можно конечно что то типа "1000  2000  3000" послать, а потом извращаться с MID(). Но наверно есть более простой способ.

0

129

Просто разделяй пробелами.
А потом читай так

Код:
PID.s = ProgramParameter(0)
BaseAddress.s = ProgramParameter(1)
Money.s = ProgramParameter(2)

Да, кстати, есть возможность передать один параметр при завершении работы проги, типа так

Код:
End 1234

Эти данные можно получить с помощью функции ProgramExitCode

0

130

Пётр написал(а):

Эти данные можно получить с помощью функции ProgramExitCode

И ты молчал, нафига мне сейчас заморачиваться тогда с WriteProcessMemory? Нет конечно настанет время и я вернусь к этой функции, но это будет не связано с этой игрой. Спасибо, ведь это решение для моей задачи оптимально.

0

131

haav написал(а):

И ты молчал

Сам только что вспомнил.
Просто я никогда это не использовал это на практике и поэтому забыл про такую возможность.

0

132

Нужна функция PureCOLOR_SetGadgetColor() с флагом  #PureCOLOR_DontSetBackColor для 4.40 версии.

То есть надо Droopy_Library для 4.40 , а есть только для 4.30

Есть ссылка?

0

133

mirashic написал(а):

То есть надо Droopy_Library для 4.40

Вот http://purebasic.info/phpBB2/download.php?id=607
Только PureCOLOR_SetGadgetColor() это из библиотеки PureCOLOR http://freenet-homepage.de/gnozal/

0

134

Спасибо обе нужны.

0

135

Проблема следующего плана: необходимо при создании окна расположить его по центру экрана, в не зависимости от разрешения на разных компьютерах. У меня есть следующая строчка кода, что там нужно заменить?

Код:
OpenWindow(1,200,200,300,300,"",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)

0

136

Нужно добавить флаг #PB_Window_ScreenCentered

Код:
OpenWindow(1,200,200,300,300,"",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)

0

137

Спасибо. А такой вопрос: есть большой список

Код:
ListIconGadget(1,0,0,300,350,"",180)
AddGadgetColumn(1, 2, "", 100)

Как в него можно занести (добавить) программно записи, например запущенные в данный момент процессы, как в диспетчере задач.

0

138

daiomik написал(а):

Как в него можно занести (добавить) программно записи, например запущенные в данный момент процессы, как в диспетчере задач.

Так можно

Код:
Procedure Timer1()
ClearGadgetItems(1)
EnumProcessInit()
Repeat
   Temp.s=EnumProcess()
   If Temp=""
     Break
   EndIf
   AddGadgetItem(1,-1,Temp)
ForEver
EndProcedure

OpenWindow(1,200,200,300,500,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ListIconGadget(1,0,0,300,500,"",180)
SetTimer_(WindowID(1),1,1000,@Timer1())
Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

0

139

Обводит EnumProcessInit() и выводит ошибку
http://i059.radikal.ru/1003/c0/90d663fb399a.gif

0

140

daiomik написал(а):

Обводит EnumProcessInit() и выводит ошибку

Библиотеку Droopy Library установи http://pure-basic.narod.ru/libs.html

0

141

Спасибо, библиотека помогла. Я так понял в процедуре используется таймер (секундомер). И когда я запускаю программу, то не могу выделить запись списка, так как через какой то промежуток времени список обновляется. Не подскажешь, как исправить этот недочет, например просто заполнить список процессорами и при нажатии например на кнопку ОБНОВИТЬ список обновился. Надеюсь, ты меня понял.

0

142

daiomik написал(а):

Я так понял в процедуре используется таймер (секундомер)

Да таймер есть и он создаётся строкой

Код:
SetTimer_(WindowID(1),1,1000,@Timer1())
daiomik написал(а):

просто заполнить список процессорами и при нажатии например на кнопку ОБНОВИТЬ

Для этого достаточно убрать выше указанную строку и вызывать процедуру при клике по кнопке

Код:
Procedure Timer1()
ClearGadgetItems(1)
EnumProcessInit()
Repeat
   Temp.s=EnumProcess()
   If Temp=""
     Break
   EndIf
   AddGadgetItem(1,-1,Temp)
ForEver
EndProcedure

OpenWindow(1,200,200,300,550,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ListIconGadget(1,0,0,300,500,"Процессы",270,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
ButtonGadget(2,220,510,80,24,"Обновить")
         ;SetTimer_(WindowID(1),1,1000,@Timer1())
Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_Gadget
     If EventGadget()=2
       Timer1()
     EndIf 
  EndIf
Until Event=#PB_Event_CloseWindow

0

143

Решил я все таки до конца "добить" диспетчер задач, но возник ряд вопросов. Для начала вот код моей программы:

Код:
Procedure Timer1()
ClearGadgetItems(1)
EnumProcessInit()
Repeat
   Temp.s=EnumProcess()
   If Temp=""
     Break
   EndIf
   AddGadgetItem(1,-1,Temp)
ForEver
EndProcedure



OpenWindow(1,300,200,300,350,"Диспетчер задач",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

If CreateMenu(1,WindowID(1))
 MenuTitle("Файл")
  MenuItem(1,"Добавить процесс")
  MenuBar()
  MenuItem(2,"Выход")
 MenuTitle("Управление")
  MenuItem(3,"Обновить")
  MenuBar()
  MenuItem(4,"Убить процесс")
  MenuItem(5,"Убить окно")
  MenuItem(0,"Окно в фокусе")
 MenuTitle("Помощь")
  MenuItem(7,"Справка")
  MenuBar()
  MenuItem(8,"О программе")  
EndIf

If CreatePopupMenu(2)
 MenuItem(3, "Обновить")
 MenuBar()
 MenuItem(4,"Убить процесс")
 MenuItem(2,"Выход")
EndIf 

ListIconGadget(1,0,0,300,330,"Имя процесса",250,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)

Repeat

event=WaitWindowEvent()
Menu=EventMenu()

If Event=516 ; Условие будет выполнено при щелчке правой кнопкой мыши
   DisplayPopupMenu(2, WindowID(1)) ; Отображаем контекстное меню
EndIf

If Event=#PB_Event_Menu
 Select Menu
  Case 2
   event=#PB_Event_CloseWindow
  Case 3
   Timer1()
  Case 8
   MessageRequester("О программе","Диспетчер задач. Сделано в PureBasic") 
 EndSelect
EndIf   


Until event=#PB_Event_CloseWindow

И так вопросы:
1. Нужно чтоб при запуске в список попали все процессы (но чтоб не обновлялись, как в выше написанном примере)
2. Почему при нажатии правой кнопки мыши на невыделенной ячейке всплывающее меню появляется со второй попытке. Мне бы хотелось, что бы и при нажатии ПКМ выделялась ячейка и появлялось меню
3. Как при нажатии пункта меню сделать так, что бы процесс в выделенной ячейки завершился.

PS. Извиняюсь, что сразу так много вопросов.

Отредактировано daiomik (28.03.2010 18:44:35)

0

144

1. Просто вызывай процедуру Timer1() перед главным циклом.

2. ListIconGadget поддерживает обработку кликов по нему, поэтому нужно определять что произошло событие в этом гаджете и с помощью EventType(), отлавливать клик правой кнопкой мышки.

3. В библиотеке "Droopy Library", есть функция KillProcess. Вот её и нужно использовать.

Код:
Procedure Timer1()
ClearGadgetItems(1)
EnumProcessInit()
Repeat
   Temp.s=EnumProcess()
   If Temp=""
     Break
   EndIf
   AddGadgetItem(1,-1,Temp)
ForEver
EndProcedure



OpenWindow(1,300,200,300,350,"Диспетчер задач",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

If CreateMenu(1,WindowID(1))
 MenuTitle("Файл")
  MenuItem(1,"Добавить процесс")
  MenuBar()
  MenuItem(2,"Выход")
 MenuTitle("Управление")
  MenuItem(3,"Обновить")
  MenuBar()
  MenuItem(4,"Убить процесс")
  MenuItem(5,"Убить окно")
  MenuItem(0,"Окно в фокусе")
 MenuTitle("Помощь")
  MenuItem(7,"Справка")
  MenuBar()
  MenuItem(8,"О программе")  
EndIf

If CreatePopupMenu(2)
 MenuItem(3, "Обновить")
 MenuBar()
 MenuItem(4,"Убить процесс")
 MenuItem(2,"Выход")
EndIf 

ListIconGadget(1,0,0,300,330,"Имя процесса",250,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
Timer1()
Repeat

event=WaitWindowEvent()
Menu=EventMenu()
; 
; If Event=516 ; Условие будет выполнено при щелчке правой кнопкой мыши
;    DisplayPopupMenu(2, WindowID(1)) ; Отображаем контекстное меню
; EndIf

If Event=#PB_Event_Gadget
  Select EventGadget()
     Case 1
       If EventType()=#PB_EventType_RightClick
         DisplayPopupMenu(2, WindowID(1)) ; Отображаем контекстное меню
       EndIf
  EndSelect
EndIf

If Event=#PB_Event_Menu
 Select Menu
  Case 2
   event=#PB_Event_CloseWindow
  Case 3
   Timer1()
  Case 4
    ProcessName.s=GetGadgetText(1)
    If ProcessName<>""
      PID=GetPidProcess(ProcessName) 
      If PID
        KillProcess(PID)
      EndIf
    EndIf
  Case 8
   MessageRequester("О программе","Диспетчер задач. Сделано в PureBasic") 
 EndSelect
EndIf   


Until event=#PB_Event_CloseWindow

Но есть один момент, если будут несколько процессов с одинаковым именем, то не факт что будет завершён именно требуемый процесс!
Нужно усложнять прогу.

0

145

Можешь объяснить подробней каждую запись этого кода

Код:
ProcessName.s=GetGadgetText(1)
    If ProcessName<>""
      PID=GetPidProcess(ProcessName) 
      If PID
        KillProcess(PID)
      EndIf
    EndIf

Как я понял в переменную ProcessName.sзаписывается текст из GetGadgetText(1). Но там же список  :dontknow:
Начиная с PID молясь непонятно становится.

0

146

В переменную ProcessName записывается текст из выбранного (выделеного) пункта списка.
Функция GetPidProcess позволяет получить идентификатор процесса (PID) по его имени.
Функция KillProcess завершает процесс с указанным идентификатором процесса (PID'ом).

Работа функций описана в справке. Нужно лишь поместить текстовый курсор на интерисующую функцию и нажать на F1.
Будет открыта справка с описанием выбраной функции.

0

147

Спасибо, разобрался

0

148

Пётр написал(а):

Но есть один момент, если будут несколько процессов с одинаковым именем, то не факт что будет завершён именно требуемый процесс!Нужно усложнять прогу.

А вот здесь интересно. Если можно по подробнее. Несколько процессов под одним именем это вирусня имелась ввиду или системные процессы типа svchost.exe? Усложнять, это считывать все процессы с одинаковым именем и гасить?

0

149

haav написал(а):

Несколько процессов под одним именем это вирусня имелась ввиду или системные процессы типа svchost.exe

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

haav написал(а):

Усложнять, это считывать все процессы с одинаковым именем и гасить?

Нет.
Можно получать имена процессов в месте с их PIDами, как здесь Загруженность процессора

0

150

Наверное следующий вопрос слишком сложный будет, но все таки. Можно ли добавить количество выделенных мегабайт для каждого процесса? Я добавил для этого GadgetColumn:

Код:
Procedure Timer1()
ClearGadgetItems(1)
EnumProcessInit()
Repeat
   Temp.s=EnumProcess()
   If Temp=""
     Break
   EndIf
   AddGadgetItem(1,-1,Temp)
ForEver
EndProcedure



OpenWindow(1,300,200,300,350,"Диспетчер задач",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

If CreateMenu(1,WindowID(1))
 MenuTitle("Файл")
  MenuItem(1,"Добавить процесс")
  MenuBar()
  MenuItem(2,"Выход")
 MenuTitle("Управление")
  MenuItem(3,"Обновить")
  MenuBar()
  MenuItem(4,"Убить процесс")
  MenuItem(5,"Убить окно")
  MenuItem(0,"Окно в фокусе")
  MenuTitle("Помощь")
  MenuItem(8,"О программе")  
EndIf

If CreatePopupMenu(2)
 MenuItem(3, "Обновить")
 MenuBar()
 MenuItem(4,"Убить процесс")
 MenuItem(2,"Выход")
EndIf 

ListIconGadget(1,0,0,300,330,"Имя процесса",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(1, 2, "Память", 80)
Timer1()
Repeat

event=WaitWindowEvent()
Menu=EventMenu()


If Event=#PB_Event_Gadget
  Select EventGadget()
     Case 1
       If EventType()=#PB_EventType_RightClick
         DisplayPopupMenu(2, WindowID(1)) ; Отображаем контекстное меню
       EndIf
  EndSelect
EndIf

If Event=#PB_Event_Menu
 Select Menu
  Case 2
   event=#PB_Event_CloseWindow
  Case 3
   Timer1()
  Case 4
    ProcessName.s=GetGadgetText(1)
    If ProcessName<>""
      PID=GetPidProcess(ProcessName) 
      If PID
        KillProcess(PID)
      EndIf
    EndIf
    Timer1()
  Case 8
   MessageRequester("О программе","Диспетчер задач. Сделано в PureBasic") 
 EndSelect
EndIf   


Until event=#PB_Event_CloseWindow

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка