Daten zu anderem Fenster senden
-
Hallo, ich wollte daten von einem fenster zum nächsten schicken mit SendMessage.. Es soll ein POINT-Struct gesendet werden, was aber nicht klappt. Habe dazu versucht mit WM_USER den Struct als lParam zu übergeben, aber es stürtzt immer ab. Das sieht ungefähr so aus:
WndProc1: POINT* pt = malloc (sizeof (POINT)); SendMessage (fensterzwei, WM_USER, 0, (LPARAM) pt); FensterZweiProc: case WM_USER: { POINT* pt = (POINT*) lParam; point.x = pt->x; point.y = pt->y; free (pt); }
ich weiß dass ich das mal geschafft habe das es funktioniert, aber ich finde das programm da nicht mehr und auch einiges bei google gesucht und gefunden, aber nicht funktioniert. Das schien mir die logischste Lösung von denen, die ich probiert habe, deshalb habe ich die hier reingemacht.
Danke schonmal!!
-
die zwei fenster sind aber schon im selben prozess, oder ?
-
ja das sind sie ... glaube ich zumindest. ich erstelle beide fenster in einer WinMain und wollte jetzt nur von einem zum anderen was schicken
-
undwo stuertzt es ab ?
uebergib halt mal point::x mit wparam und point::y mit lparam.
wenns da noch immer knallt dann liegt es nicht an deinem gezeigten code
-
habe ich schon gemacht, da passiert nichts, also stürzt nicht ab...
-
achso und es stürtzt ab sobald SendMessage ausgelöst wurde
-
ich hab mal ein minimal beispiel gemacht, um das bei mir zu testen. gibts kein problem
das ist der source
#include <windows.h> HINSTANCE hins = 0; HWND win2 = 0; int WINAPI WinMain(HINSTANCE hin, HINSTANCE, char*, int) { hins = hin; WNDCLASS wc1{}; wc1.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc1.hCursor = LoadCursor(0, IDC_ARROW); wc1.hInstance = hin; wc1.lpszClassName = TEXT("wc1"); wc1.style = CS_VREDRAW | CS_HREDRAW; WNDCLASS wc2{}; wc2.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc2.hCursor = LoadCursor(0, IDC_ARROW); wc2.hInstance = hin; wc2.lpszClassName = TEXT("wc2"); wc2.style = CS_VREDRAW | CS_HREDRAW; HWND hwnd1 = 0; HWND hwnd2 = 0; wc1.lpfnWndProc = [] (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> LRESULT { static HWND btn = 0; POINT *pt = 0; switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE: btn = CreateWindow(TEXT("button"), TEXT("SEND"), BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 120, 120, 120, 30, hwnd, 0, hins, 0); return 0; case WM_COMMAND: pt = (POINT*)malloc(sizeof(POINT)); SendMessage(win2, WM_USER, 0, (LPARAM)pt); return 0; default: break; } return DefWindowProc(hwnd, msg, wparam, lparam); }; wc2.lpfnWndProc = [](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -> LRESULT { POINT *pt = 0; switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_USER: pt = (POINT*)lparam; MessageBox(hwnd, TEXT("angekommen"), TEXT("Message"), MB_OK); pt->x; pt->y; free(pt); return 0; default: break; } return DefWindowProc(hwnd, msg, wparam, lparam); }; RegisterClass(&wc1); RegisterClass(&wc2); hwnd1 = CreateWindow(TEXT("wc1"), TEXT("Fenster 1"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 300, 0, 0, hins, 0); hwnd2 = CreateWindow(TEXT("wc2"), TEXT("Fenster 2"), WS_OVERLAPPEDWINDOW, 800, 100, 500, 300, 0, 0, hins, 0); win2 = hwnd2; ShowWindow(hwnd1, SW_SHOW); UpdateWindow(hwnd1); ShowWindow(hwnd2, SW_SHOW); UpdateWindow(hwnd2); MSG msg; while(GetMessage(&msg, 0, 0, 0) != 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
-
Okay, ich gucke mir das mal stück für stück an und vergleiche das dann finde ich bestimmt den fehler sehr schnell..
danke sehr!