Structure per SendMessage übergeben Hilfe :(

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Structure per SendMessage übergeben Hilfe :(

Beitrag von GronkhLP »

Tach oder Abend und Frohes Neues Jahr :D
Ich habe zwei Proggis und will eine Kommunikationsschnittstelle via Callback und SendMessage herstellen. Reine Werte sind kein Problem, diese zu übergeben, aber wie sieht es mit Structuren aus?
Grundsätzlich sollte es kein Problem sein, weil es im WinAPI öfters gemacht wird. Zum Beispiel...

Code: Alles auswählen

point\x = 100
point\y = 200
ClientToScreen_(hWnd, @point)
Wie mache ich das mit SendMessage und Callback bei eigenen Messages, um eine eigene Structure zu senden und zu empfangen?
PS: Ich habe auch was über SharedMemory gelesen, aber möchte erstmal mit SendMessage und Callback realisieren, nur wie? :D
Bild
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: Structure per SendMessage übergeben Hilfe :(

Beitrag von NicTheQuick »

Ich bin bei Windows mittlerweile etwas eingerostet, aber um Shared Memory kommst du nicht herum, denn selbst wenn du den Pointer zu einer gefüllten Struktur per SendMessage_() an ein anderes Programm übergeben bekommst, kann das andere Programme nicht auf den dahinter liegenden Speicher zugreifen.
Das heißt sobald du SharedMemory benutzen kannst, ist der Rest easy.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Structure per SendMessage übergeben Hilfe :(

Beitrag von edel »

Frohes neues Gronkh und schoen das ihr endlich das UFO hinter euch gelassen habt ;)

Unter Windows darf ein Programm nicht auf den Speicher eines anderen Programms zugreifen. Du musst also erst ein Speicherblock aus dem Ziel-Prozess holen, dort deine Werte reinschreiben und das dann an dein Fenster senden.

Beispiel (Empfaenger) :

Code: Alles auswählen


#MYMESG = #WM_USER + 1000

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Procedure Callback(hWnd, Msg, wParam, lParam)
  Protected *point.POINT
  
  
  If Msg = #MYMESG
    *point = lParam
    
    If *point
      SetGadgetText(0, Str(*point\x))
      SetGadgetText(1, Str(*point\y))
    EndIf
    
    
  EndIf
    
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Procedure Main()
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 60, "MyWindow")
    
    SetWindowCallback(@callback(), 0)
    
    TextGadget(#PB_Any, 10, 10, 40, 25, "Point\x : ")
    TextGadget(#PB_Any, 10, 35, 40, 25, "Point\y : ")
    
    TextGadget(0, 70, 10, 50, 25, "0")
    TextGadget(1, 70, 35, 50, 25, "0")
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf
  
  
EndProcedure:End Main()

Beispiel (Sender) :

Code: Alles auswählen


#MYMESG = #WM_USER + 1000
#WINDO_TITLE = "MyWindow"

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Procedure Main()
  
  
  Protected hProcess
  Protected hPid
  Protected hWnd
  Protected WindowTitle.s = Space(1000)
  Protected len
  Protected mem.i
  Protected pt.Point
  
  pt\x = 424
  pt\y = 565
  
  hWnd = GetDesktopWindow_()
  hWnd = GetWindow_(hWnd, #GW_CHILD)
  
  ; Fenster suchen
  Repeat
    
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
    
    len = GetWindowText_(hWnd, @WindowTitle, 1000)
    
    If len 
      If PeekS(@WindowTitle, len) = #WINDO_TITLE
        GetWindowThreadProcessId_(hWnd, @hPid)
        Break
      EndIf      
    EndIf
    
  Until hWnd = 0
  
  ; Nachricht senden
  If hPid
    hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, hPid)
    
    If hProcess
      
      mem = VirtualAllocEx_(hProcess, 0, SizeOf(Point), #MEM_RESERVE | #MEM_COMMIT, #PAGE_READWRITE) 
      
      If mem
        WriteProcessMemory_(hProcess, mem, @pt, SizeOf(Point), #Null)
        SendMessage_(hWnd, #MYMESG, 0, mem)
        VirtualFreeEx_(hProcess, mem, SizeOf(Point), #MEM_RELEASE)
      EndIf
      
      CloseHandle_(hProcess)
    EndIf
    
  EndIf
  
EndProcedure:End Main()
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Structure per SendMessage übergeben Hilfe :(

Beitrag von Derren »

Wie wäre es denn, wenn du die Struktur aufteilst?
Das würde dann wie bei einem Netzwerk funktionieren, nur eben lokal.
Du sendest ein "Achtung, hier kommt Post", dann sendest du ne Menge Daten, und am Ende ein "Ok, das war's!"
Dann kannst du alles zusammen setzen und fertig.

Und falls es dir wirklich nur um Point geht (auch wenn es nur ein Beispiel war) kannst du immernoch mehrere Werte in einen Integer packen.
Signatur und so
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Structure per SendMessage übergeben Hilfe :(

Beitrag von GronkhLP »

Sorry, dass ich erst jetzt dazu komme, eure Antworten zu lesen. Danke an Alle und vorallem dank an edel für den super Code, der mir auf jeden Fall weiterhilft. :)
Bild
Antworten