C++ sendmessage wysyła dziwny text

0

Mianowicie próbuje wysłać SendMessage do notatnika, zlokalizowałem kontrolke "Edit", i zamiast tekstu który zdefiniowałem wysyła jakieś krzaki, wiecie może co jest nie tak :/ ? i nie interesuja mnie metoda,
HWND hAppClient = FindWindow(NULL, L"Notepad.txt");
SetForegroundWindow(hAppClient);
SetFocus(hAppClient);
HWND hWndChild = GetWindow(hAppClient, GW_CHILD);
SendMessage((HWND) hWndChild, WM_SETTEXT,NULL, (LPARAM)L"blablabla");
ponieważ to ogranicza możliwości :P

0

Jeżeli przekazujesz jakikolwiek bufor dodatkowy w komunikatach pomiędzy aplikacjami to ten bufor musi pochodzić z:
GlobalAlloc() - http://msdn.microsoft.com/en-us/library/aa366574%28v=vs.85%29.aspx
Czyli

  1. przydziel pamięć za pomocą tego wyżej
  2. zablokować GlobalLock
  3. wpisać tam ten twój tekst
  4. wysłać komunikatem
  5. odblokować GlobalUnlock
  6. zwolnić GlobalFree
0

E tam , zresztą mija się to z celem bo alokacja po stronie aplikacji wywołującej SendMsg nic nie da .
Komunikat WM_SETTEXT jest przekazywany w specyficzny sposób , system rozpoznaje ten rodzaj komunikatu i przekazanie
tekstu powinno działac ponieważ napis jest kopiowany do pamięci dostępnej dla aplikacji zawierającej wskazane okno.
Przy odbieraniu WM_SETTEXT zostanie przydzielony obszar w pliku (odwzorowanym na pamięć) który może być użytkowany
przez inne procesy , tam zostanie skopiowany napis.

Byc może problem jest w tym jaki typ napisu wysyłasz ,a jak traktuje to aplikacja odbierająca .
Np. wysyłasz string UNICODE a aplikacja odbierająca nie jest do tego przystosowana ,lub wysyłasz C-string 1 bajt na znak
,a odbiorca oczekuje napisu UNICODE .

0

Metoda faktycznie zadziała, ale wcale nie musi być to GlobalAlloc, równie dobrze może być LocalAlloc, obie w Win32 to nakładki na RtlAllocateHeap, który obsługuje 'nieco' więcej flag niż Microsoft podaje. To zachowanie jest obecnie nieudokumentowane, istnieje w dużej mierze dla kompatybilności z Win16, jeden z miliona mechanizmów kompatybilności wstecznej, o których niemal wszyscy zapomnieli... Przyjmowanie uchwytów nie jest nigdzie opisane obecnie, do tego obsługiwane na podobnej zasadzie jak czyste pointery (poza tymi kilkoma przypadkami, gdzie dla wstecznej kompatybilności API oczekuje uchwytu z GlobalAlloc, ale te funkcje można policzyć na palcach jednej ręki).

Co do ANSI/UNICODE to system zna typ okna (którą funkcją je stworzono - IsWindowUnicode), SendMessageA ze stringiem ANSI jest równoważne SendMessageW ze stringiem UNICODE, podczas wysyłania wiadomości zostanie zrobiona translacja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1