Seite 1 von 1

Mit Sendmessage an das Fenster "Teilnehmer" ein Byte senden

Verfasst: 18.02.2013 14:20
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

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

Verfasst: 18.02.2013 15:52
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?

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

Verfasst: 18.02.2013 15:59
von funkheld
Jup danke.
An alle sichtbaren Fenster und auch an ein bestimmtes "Teilnehmer".
Ein Byte senden, kein Tastendruck.

Danke.

gruss
peter

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

Verfasst: 18.02.2013 16:43
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.

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

Verfasst: 23.02.2013 23:47
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

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

Verfasst: 24.02.2013 00:21
von NicTheQuick
Und welche Sprache soll das sein?

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

Verfasst: 24.02.2013 00:28
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. <)

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

Verfasst: 24.02.2013 00:28
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

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

Verfasst: 24.02.2013 10:09
von funkheld
Jup, danke. Funktioniert wunderbar.

Gruss
peter