Mit Sendmessage an das Fenster "Teilnehmer" ein Byte senden

Anfängerfragen zum Programmieren mit PureBasic.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Mit Sendmessage an das Fenster "Teilnehmer" ein Byte senden

Beitrag von funkheld »

Hallo, guten Tag.
Ich möchte mit Sendmessage an das Fenster "Teilnehmer" ein Byte senden und auch mal an alle Fenster senden.
Wie geht das ?

Danke.

Gruss
peter
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von NicTheQuick »

Was meinst du mit allen Fenstern? Alle sichtbaren Fenster? Oder auch alle versteckte? Auch Fenstern in Fenstern?
Und was meinst du mit "Byte senden"? Eine Tastatureingabe simulieren? Oder User-Events senden?
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von funkheld »

Jup danke.
An alle sichtbaren Fenster und auch an ein bestimmtes "Teilnehmer".
Ein Byte senden, kein Tastendruck.

Danke.

gruss
peter
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von NicTheQuick »

Ich nehme mal an das soll alles unter Windows laufen.
Bestimmte Fenster finden kannst du mittels der API "FindWindow_()" und alle Fenster auflisten mittels "EnumWindows_()". Dazu bitte die Suche hier im Forum nutzen.

Mit "SendMessage_()" kannst du dann an ein so gefundenes Handle eines Fensters Nachrichten schicken. Aber dafür gibt's verschiedene Wege. Denn es ist nicht vorgesehen einfach nur ein Byte zu versenden. Das muss zusammen mit einem bestimmten Event ankommen und dann gibt es da die Parameter wParam und lParam in einem Window-Callback, die entweder einfache Werte sein können oder einen Pointer zu einem Speicherbereich enthalten können. Ab der Stelle bin ich allerdings überfragt, da ich selbst schon lange kein Windows mehr nutze. Aber es gibt hier im sicherlich ähnliche Dinge, die schon gemacht wurde und vielleicht auch genau das sind, was du suchst.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von funkheld »

Hallo, ich habe etwas gefunden.
Ich kann es leider nicht umsetzen.
Wer kann dieses mal in Purebasic umsetzen ?

Danke.

Gruss
peter

Code: Alles auswählen

Dlg&     = Create("Dialog", %hwnd, "Senden", 220, 190, 410, 280)
senden& = Create("Button", Dlg&, "Senden", 110, 220, 80, 30)
Ende&    = Create("Button", Dlg&, "Ende", 210, 220, 80, 30)

IsActive& = 0
InMemory& = 4000
'1024 Bytes Speicher
SizeOfMem& = 1024
'Speicherbereich anlegen
hmap&     = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)

'die ersten 4 Bytes erhalten das Fensterhandle
Long   hMapView&,0 = %hwnd
'die nächsten 4 Bytes bleiben frei für das Fensterhandle von Programm 2

wert&=0
WhileNot @Clicked(Ende&)
  WaitInput
  If @Clicked(senden&)
    If Long(hMapView&,4) <> 0
      IsActive& = 1
    Endif
    dat_send
  EndIf
EndWhile

End

proc dat_send
  wert&=wert&+1
  long hMapView&,8 = wert&

  If IsActive&
    sendMessage(Long(hMapView&,4),InMemory&,0,0)
  endif
endproc
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von NicTheQuick »

Und welche Sprache soll das sein?
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von c4s »

funkheld hat geschrieben:ich habe etwas gefunden.
Ich kann es leider nicht umsetzen.
Wer kann dieses mal in Purebasic umsetzen ?
... liest sich wie ein Gedicht. <)
Zuletzt geändert von c4s am 24.02.2013 00:29, insgesamt 1-mal geändert.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von ts-soft »

Der XProfan-Code ist unvollständig!
Es muss windows.ph eingebunden werden, ausserdem ist keine Variablendeklaration vorhanden.
Wenn also solche Fragen kommen, bitte funktionierenden Code posten!

Hier die 1:1 Übersetzung nach PureBasic, wohl nicht funktionstüchtig, aber das ist Dein Code ja
auch nicht :mrgreen:

Code: Alles auswählen

EnableExplicit

Global IsActive.l = 0
Global InMemory.l = 4000
Define SizeOfMem.l = 1024
Define hWnd.i, hmap.i
Global hMapView.i
Global wert.l = 0

Procedure dat_send()
  wert + 1
  PokeL(hMapView + SizeOf(Integer) + 4, wert)
  
  If IsActive
    SendMessage_(PeekL(hMapView + 4), InMemory, 0, 0)
  EndIf
EndProcedure

hWnd = OpenWindow(0, 220, 190, 410, 280, "Senden")
ButtonGadget(0, 110, 220, 80, 30, "Senden")
ButtonGadget(1, 210, 220, 80, 30, "Ende")


hmap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE|#SEC_COMMIT|#SEC_NOCACHE, 0, SizeOfMem, "MeinSpeicher")

hMapView = MapViewOfFile_(hmap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
PokeL(hMapView, hWnd)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          If PeekL(hMapView + 4) <> 0
            IsActive = 1
          EndIf
          dat_send()
        Case 1
          Break
      EndSelect
  EndSelect
ForEver
Ausserdem unterstützt XProfan Filemapping nativ, weiß also nicht, warum hier die API verwendet wird.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

Re: Mit Sendmessage an das Fenster "Teilnehmer" ein Byte se

Beitrag von funkheld »

Jup, danke. Funktioniert wunderbar.

Gruss
peter
Antworten