PureBasic - форум

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

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


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


Вопросы новичка (продолжение…)

Сообщений 961 страница 990 из 990

961

Значит FireFox стоит "браузером по умолчанию".

Исходя из описания функции
> Result = RunProgram(Filename$ [, Parameter$, WorkingDirectory$ [, Flags [, SenderProgram]]])

попробуй так

Prog=RunProgram("chrome.exe","https://mail.ru/","",#PB_Program_Open)

0

962

Здравствуйте. Помогите разобраться кто может. Есть код. Даже работает, но криво.  смысл в наполнении ComboBox из файла с сортировкой согласно введенных символов. проблема в том, что в самом Combo не отображаются символы и вообще возникает ощущение зависания. Где ошибка? Спасибо заранее

Procedure Sv_Spis(N_Okna.l,File.s,Mark.s)
  ClearGadgetItems (N_Okna)
A=Len(Mark)
  If ReadFile(2,File)
    While Eof(2) = #False
      S1.s=ReadString(2)
      If Mid(S1,1,A)=Mark
        b=1
      EndIf
    Wend
    CloseFile(2)
   EndIf
    If b=1
      SendMessage_(GadgetID(N_Okna),#CB_SHOWDROPDOWN,1,1)   
    EndIf
  EndProcedure

If OpenWindow(0, 0, 00, 1200, 800, "", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget| #PB_Window_ScreenCentered)
   
ComboBoxGadget(1, 400, 10, 300, 25,#PB_ComboBox_Editable )     

  Repeat
         Event.l = WaitWindowEvent()
         Select Event
     
           Case #PB_Event_Gadget
 
             Select EventGadget()
                 
               Case 1
              If GetGadgetText(1)<>Str_G.s 
                     
                Str_G.s=GetGadgetText(1)   
                Sv_Spis(1,"FileNaim",Str_G)
              EndIf
                           
                  EndSelect
      EndSelect 
    Until Event=#PB_Event_CloseWindow
  EndIf
  End

0

963

В коде не заполняется ComboBox.

0

964

спасибо. действительно в данном фрагменте отсутсвует add.
Но в целом все равно не могу наполнить Combo с подсказкой. Это вообще реально?
Чтоб при наборе текста шел выбор значений наполнения и выпадал список?
Варианты пробовал разные. либо в комбике курсор встает в поз 1 либо текст ввода не отображается либо присваивается верхнее значение из списка

0

965

Здравствуйте!
Создал TCP сервер, который получает некие данные, разделённые $0D $0A. Каждый параметр я распихиваю по разным гаджетам в окошке
Принимаю

Код:
 ReceiveNetworkData(Cl, *Buffer, 1000)
  
text_tcp=PeekS(*Buffer,-1,#PB_Ascii )

FillMemory(*Buffer, 1000)

Подскажите , как мне считывать из буфера до  $0D $0A?
или может как то их вытягивать уже из переменной text_tcp,?

0

966

Код:
text_tcp.s="1234"+Chr($0D)+Chr($0A)+"5678"+Chr($0D)+Chr($0A)

Count = CountString(text_tcp, Chr($0D)+Chr($0A))

For i=1 To Count
  Debug StringField(text_tcp, i, Chr($0D)+Chr($0A))
Next

0

967

тут Петр писал код по созданию окна со своим собственным классом: Вопросы новичка (продолжение…)

однако у меня ругается:
Unresolved external symbol
'_PB_Window_ProcessEvent_UNICODE@16'

нет ли такого-же кода, но с перламутровыми пуго... эээ... для PB 6.0 ?

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

***

с первой задачей справился. но нет, первая программа не среагировала :)

Отредактировано SeregaZ (16.02.2024 06:19:34)

0

968

итак... по всей видимости в обеих программах поднимаются сервера для приемки сообщений. делаю сервер на PB на нужном порту. после запускаю первую программу. она пытается на PB сервер что-то отправить. запоминаю этот пакет. делаю операцию наоборот - запускаю вторую программу, и пытаюсь из PB отправить этот пакет в неё... но чот не выходит. решил посмотреть через tcpview. и там выясняется что первая программа, помимо поднятия сервера для приемки - время от времени отправляет какой-то запрос по совершенно другому адресу. казалось бы - запоминай порт и пиши приемщик на этом порту... но в том то и проблема :) там каждый раз новый порт, скажем + 2 к последнему порту. но каким-то образом вторая программа об этом знает. так что я пока в тупике. и в связи с чем вопрос! нет ли для PB некоего широкопортового сервера, чтобы он ваще все порты слушал? в справке PB полистал и вроде там есть что-то такое GetClientPort(Client) , но что-то я пока не понимаю как это работает. ведь сначала же надо сервер многопортовый запустить... голова кароче не соображает :) а в исходниках ничерта не понимаю... надеялся там что-то типа описание протокола есть.

***

ага! GetClientPort(Client) помогло! теперь, я так понимаю, мне нужно второй чтоль сервер запускать с этим портом, чтобы прочитать чего он хочет? или я чото не понимаю :)

Отредактировано SeregaZ (16.02.2024 15:58:21)

0

969

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

отправляет какой-то запрос по совершенно другому адресу.

По какому? Локальный, глобальный?

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

надеялся там что-то типа описание протокола есть.

Если нет описания протокола, то как планируете взаимодействовать с программой?

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

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

Маловероятно. Нет никакого смысла запускать 1500 серверов если достаточно одного.

0

970

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

Код:
PRI * HTTP/2.0 

SM

а это типа все очень и очень плохо :) кто-то пишет нужны сертификаты, кто-то что шифрование... черт ногу сломит. я надеялся там простенько.

по поводу протокола - исходники то есть, но там кажется си++, и очень много всяких файлов, где черт ногу сломит. так то по тексту окошка, которое вылазит в первой программе - где что-то типа "Wait connection" - я нашел где это, но там какого-то порядка команд или может их значений в каком-то Select - не вижу.

0

971

вот как происходит в оригинале, и как с моими попытками это эмулировать. меня смущает что PB стартует сервера с адреса 0.0.0.0 хотя должно быть по идее 127.0.0.0. и я не вижу ответа, хотя вроде бы там что-то есть какое-то движение...

https://i123.fastpic.org/big/2024/0217/6f/0dc5c2af18c2dbe41c2b1232008a416f.png

вот так пытаюсь отправить первоначальный пакет, и по идее должен получить ответ, так как TCPView что-то видит исходящее... но видимо я чото не то "слушаю" и поэтому ответ не доходит куда надо...

Код:

Enumeration
  
  #Server01
  
  #Window
  
  #Editor
  
  #Button
  
EndEnumeration

Port = 24946 ; IDA
;Port = 23946 ; GENS

Global EOL$
EOL$ = Chr(13)+Chr(10)

*Buffer = AllocateMemory(10000)

*SendBuffer = AllocateMemory(200)
Length = *SendBuffer
Length + PokeS(Length, "PRI * HTTP/2.0" + EOL$, -1, #PB_UTF8)  
Length + PokeS(Length, ""               + EOL$, -1, #PB_UTF8)  
Length + PokeS(Length, "SM"             + EOL$, -1, #PB_UTF8)  
Length + PokeS(Length, ""               + EOL$, -1, #PB_UTF8)   
;Length + PokeS(Length, ""               + EOL$, -1, #PB_UTF8) 
Length + PokeS(Length, #CRLF$, -1, #PB_UTF8) 

test$ = PeekS(*SendBuffer, Length - *SendBuffer, #PB_UTF8) ;: Debug test$

If CreateNetworkServer(#Server01, Port)

  OpenWindow(#Window, 100, 40, 400, 300, "IDA")
  
  StickyWindow(#Window, 1)
  
  EditorGadget(#Editor, 10, 10, 380, 240)
  
  ButtonGadget(#Button, 10, 260, 100, 20, "send header")
  
  ;Debug "server starts " + Str(Port)
  AddGadgetItem(#Editor, -1, "server starts " + Str(Port))

  Repeat
    
    ;{ windows repeat
    Repeat
      WEvent = WindowEvent()
      
      Select WEvent
          
        Case #PB_Event_Gadget
          Select EventGadget()
                        
            Case #Button
              ; i should send
              ;PRI * HTTP/2.0
              ;
              ;SM
              ;
              
              ConnectionID = OpenNetworkConnection("127.0.0.1", 23946) ; to Gens
              If ConnectionID
                AddGadgetItem(#Editor, -1, "have connection for send")                
                
                sendresult = SendNetworkData(ConnectionID, *SendBuffer, Length - *SendBuffer)
                
                AddGadgetItem(#Editor, -1, "result of sending " + Str(sendresult))

                ;CloseNetworkConnection(ConnectionID)
              Else
                ;MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
                AddGadgetItem(#Editor, -1, "probably server is not work")
              EndIf
              
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Quit = 1
         
          
      EndSelect

    Until WEvent = 0
    ;}
    
    SEvent = NetworkServerEvent()     
    If SEvent
      ; some event happen
      
      ServerID = EventServer()
      ; what server it was
      
      ClientID = EventClient()
      ; what client it was
  
      Select SEvent
      
        Case 1  ; When a new client has been connected...
          ;Debug "in"
          AddGadgetItem(#Editor, -1, Str(ServerID) + " connection")
          
          
        Case 4  ; When a client has closed the connection...
          ;Debug "*** out"
          AddGadgetItem(#Editor, -1, Str(ServerID) + " disconnection")
          
        Default
          RequestLength = ReceiveNetworkData(ClientID, *Buffer, 2000)
          If RequestLength
            a$ = PeekS(*Buffer, RequestLength, #PB_UTF8)
            AddGadgetItem(#Editor, -1, a$)
          Else
            AddGadgetItem(#Editor, -1, "zero")
          EndIf
          
      EndSelect

    Else
      Delay(20)  ; Don't stole the whole CPU !
    EndIf
    
  Until Quit = 1 
    
  CloseNetworkServer(#Server01)
Else
  MessageRequester(AtomicTitle$, "Error: can't create the server (port in use ?).", 0)
EndIf
  
End 
 

конечно при условии что этот PRI * HTTP/2.0 не говорит о том, что мне нужны какие-то дополнительные танцы с бубном с подключением библиотек и всего такого прочего. стандартные средства PB я еще чо-то как-то... а вот когда надо что-то отдельно подключать, то здесь все. капец.

***

нули победил.

Код:
If CreateNetworkServer(#Server01, Port, #PB_Network_TCP, "127.0.0.1")

толку не дало :)

Отредактировано SeregaZ (17.02.2024 04:24:40)

0

972

Код:
PRI * HTTP/2.0

HTTP версии 2.0 — это нетекстовый протокол. Спецификации можно читать тут: https://www.rfc-editor.org/rfc/rfc7540

Кроме того, у вас сервер принимает соединение после того как окно закроется.

0

973

ну я пока бросил эту затею... не понимаю :) почитал зато блог того автора, и там он пишет про какую-то shared memory. видимо сервер тут просто первоначальную связь между программами наладить... а дальше видимо происходит что-то типа как ArtMoney делает, то есть влезает в чужую программу и пишет в её память. и эта чужая программа делает точно также в обратную сторону. видимо это работает как-то так.

пока решил доделать то, что понимаю и что получается :)

0

974

итак. рассказываю. при загрузке файла происходит первоначальный парсинг. а после добавление к этому распарсенному нераспарсенных участков, где как в хекс редакторе происходит компоновка по 16 байт в ряд. это добавление не обработанного кода занимает 95% времени при загрузке. ладно я как бы еще смирился, что такой затуп будет происходить при загрузке файла... один раз как бы. но потом решил добавить еще "горячее" дизассемблирование по клавише С начиная с какого-то, мышкой щелкнутого, байта. для чего сделал так:

1. первоначальный парсинг. собирается только код и вносится в лист.
2. происходит копия этого листа в некую базовую начальную копию.
3. происходит добавление в лист "бэшек" - то есть нераспарсенного кода dc.b. (получается дописывает в конец листа все блоки бэшек)
4. сортировка листа по адресу в роме. тут все становится на свои места. блоки кода правильно чередуются с блоками бэшек. и мы имеем готовый лист построчно для вывода на канвасе.

тут приспичило пользователю жмакнуть С - горячий дизасм на какой-то бэшке.
1. происходит восстановление копии первоначального парсинга кода в основной лист, который без бэшек а только код, который распарсился в самом самом начале.
2. происходит добавление нового адреса из той клавиши С, или даже адресов, так как там может быть рекурсия, что родились при этом горячем дизасме.
3. происходит добавление в лист бэшек.
4. сортировка листа по адресу.

вот это самое добавление в лист бэшек и жрет 95% времени затупа... как бы найти элегантное, а главное быстрое решение? то есть изначально весь код разбивается на строки, которые потом можно скроллить в выводном канвасе. там происходит форматирование, где надо добавляются пустые строки для визуального отделения блоков, где надо добавляются метки. может быть делать два листа - лист с блоками кода, а второй с блоками бэшек. но потом как отслеживать в этом втором листе какие бэшки перешли в разряд кода и значит их надо удалить, какие оставить... мутно все в голове однако :) не могу ухватить мысль как выкрутится.

0

975

Подскажите Api.
Нужно кликать в свернутом окне на определённую точку левой мышкой.

0

976

PureAutoIt, функция ControlClick().

0

977

Не нажимается, и забыл упомянуть что это игра.

Код:
XIncludeFile "..\..\PureAutoIt.pbi"
UseModule PureAutoIt

hWnd.s = Str(WinWait("Game"))
ControlClick(hWnd, "", "", "left", 1, 25, 25 )

0

978

@ZOLO@ написал(а):

hWnd.s = Str(WinWait("Game"))
ControlClick(hWnd, "", "", "left", 1, 25, 25 )

Функция ControlClick принимает заголовок окна, а не hWnd в строковом виде. Может будет работать.

Код:
WinWait("Game")
ControlClick("Game", "", "", "left", 1, 25, 25 )

0

979

Тоже не работает.
Вот набросал, работает но не так как хочу.

Код:
hwnd=FindWindow_("UnityWndClass","Banana")

SetForegroundWindow_(hwnd)
SetFocus_(hwnd)

x = 311
y = 356

GetWindowRect_(hwnd, R0.RECT)
SetCursorPos_(R0\left+x,R0\top+y)

l.l = (y << 16 | x)

PostMessage_(hwnd, #WM_LBUTTONDOWN , 1, l)
PostMessage_(hwnd, #WM_LBUTTONUP , 0, l)

0

980

@ZOLO@ написал(а):

Тоже не работает.
Вот набросал, работает но не так как хочу.

а точно окно находится?

0

981

да

Когда курсор находится в определённой области он нажимается, там даже координаты другие или 0 он нажимается.

https://forumupload.ru/uploads/0009/ae/28/571/t153224.png

Отредактировано @ZOLO@ (17.06.2024 14:59:52)

0

982

А откуда такие значения:
x = 311,y = 356?

0

983

Знатоки, подскажите: SizeOf(BITMAPINFO) выдает значение 44. Из документации выходит, что размер 40 байт. Верно, нет?

0

984

а так 40

Код:
Structure BITMAPINFO1
	bmiHeader.BITMAPINFOHEADER
; 	StructureUnion
; 	bmiColors.RGBQUAD[0]
; 	dummybmiColors.RGBQUAD[1]
; 	EndStructureUnion
EndStructure

Debug SizeOf(BITMAPINFO1)

0

985

Как-то вольно обходятся к .BMP, значения разные. Вот исправленный пример  с форума Flat Assembler

Код:
; ;https://board.flatassembler.net/topic.php?t=13462
;Windows BMP files header
;https://www.file-recovery.com/bmp-signature-format.htm
; bmpHeader:              ; 54 bytes
;         Signature       db 0x42,0x4D,0xC6,0x5F,0x01,00,00,00,00,00,0x36,00,00,00        ; 14 bytes
;         bi24BitInfo     BITMAPINFO                                                      ; 40 bytes

;Initialize bitmapinfo
sw=GetSystemMetrics_(#SM_CXSCREEN)
sh=GetSystemMetrics_(#SM_CYSCREEN)

bmiHeader.BITMAPINFOHEADER
bi24BitInfo.BITMAPINFO

bi24BitInfo\bmiHeader\biSize=SizeOf(BITMAPINFOHEADER)
bi24BitInfo\bmiHeader\biWidth=sw
bi24BitInfo\bmiHeader\biHeight=sh
bi24BitInfo\bmiHeader\biPlanes=1
bi24BitInfo\bmiHeader\biBitCount=24
bi24BitInfo\bmiHeader\biCompression=0
bi24BitInfo\bmiHeader\biSizeImage=sw*sh*3

memDC=CreateCompatibleDC_(0)
hDIB=CreateDIBSection_(memDC, @bi24BitInfo, 0, @pbits, 0, 0)
SelectObject_(memDC,hDIB)
winDC=GetDC_(0)
BitBlt_(memDC, 0, 0, sw, sh, winDC, 0, 0, #SRCCOPY)

CreateFile(0,"dsktop.bmp")

PokeL (?bmSignature+2,sw*sh*3+54)
WriteData(0,?bmSignature,14)
WriteData(0,@bi24BitInfo,40);SizeOf(BITMAPINFO)-4)

;Debug SizeOf(BITMAPINFO)=44?

WriteData(0,pbits,sw*sh*3)
CloseFile(0) 

DeleteDC_(memDC)
DeleteObject_(hDIB)
ReleaseDC_(#HWND_DESKTOP,winDC)

DataSection
  bmSignature:
  Data.a $42,$4D,$C6,$5F,$01,00,00,00,00,00,$36,00,00,00        ; 14 bytes

0

986

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

А откуда такие значения:
x = 311,y = 356?

из области банана взял.
И если мышка находится на окне в рандомном месте он нажимает мышкой, если нет, то нет. 

Код:
Procedure.l MAKELPARAM(LoWord.l, HiWord.l)
  ProcedureReturn ((HiWord << 16) | (LoWord & $ffff))
EndProcedure

Procedure WindowsClick(lpClassName.s, lpWindowName.s)  
  HWND = FindWindow_(lpClassName,lpWindowName)
  If HWND 
    If IsIconic_(HWND)
      Debug ShowWindow_(HWND, #SW_SHOW)   
      Debug 1
    EndIf
    SetForegroundWindow_(HWND)
    ;SetFocus_(HWND)
    ;SetActiveWindow_(HWND)

    GetWindowRect_(HWND, lpRect0.RECT)
    GetClientRect_(HWND, lpRect1.RECT)
    
    x.l = lpRect0\Left + (lpRect1\right  / 2)   
    y.l = lpRect0\top  + (lpRect1\bottom / 2)
    
    SetCursorPos_(x, y)
    L = MAKELPARAM(x, y)
   Ran = Random(200, 10)
    
Debug Ran
    For var = 1 To Ran
      SendMessage_(HWND, #WM_LBUTTONDOWN, 1, L) 
      SendMessage_(HWND, #WM_LBUTTONUP, 0, L)  
    Next

  EndIf
EndProcedure

WindowsClick("UnityWndClass","Banana")
Delay(1000)
WindowsClick("UnityWndClass","Cats")

Как улучшить код, чтоб он переключался между 2 приложениями и делал одно окно активным, а потом другое?
А то если свернуто он одно запускает а другое нет.

0

987

странный способ подсчета
x.l = (lpRect1\right-lpRect0\Left + ) / 2

0

988

Здравствуйте.
Есть скрипт
Просто вывести поверх рабочего стола большое чёрное окно без рамок:

Код:
ExamineDesktops()
OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), #Empty$, #PB_Window_BorderLess)
StickyWindow(0, #True)
ShowCursor_(#False)
StartDrawing(WindowOutput(0))
Box(0, 0, OutputWidth(), OutputHeight(), 0)
StopDrawing()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Пожалуйста, я прошу, как добавить возможность завершения скрипта:
1) один раз нажать F4
или
2) два раза нажать F4
или
3) нажать и держать (длинное=долгое нажатие) F4

Отредактировано SharkyEXE (29.06.2024 11:48:44)

0

989

попробовать с

  If GetAsyncKeyState_(#VK_ESCAPE)&32768
   break
  EndIf

0

990

хук на клавиатуру ставить, гугли #WH_KEYBOARD_LL на офсайте.
По сути для всех трех вариантов достаточно срабатывание на нажатие #WM_KEYDOWN, то есть второй раз нажимать не придётся и ждать нажатием не придётся, как надавил, сразу сработало.

0


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