C++ sendmessage wysyła dziwny text

Odpowiedz Nowy wątek
2011-03-17 22:55
bleach
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

Pozostało 580 znaków

2011-03-18 01:13
0

Jeżeli przekazujesz jakikolwiek bufor dodatkowy w komunikatach pomiędzy aplikacjami to ten bufor musi pochodzić z:
GlobalAlloc() - http://msdn.microsoft.com/en-[...]ry/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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2011-03-18 08:02
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 .


edytowany 6x, ostatnio: dzejo, 2011-03-18 08:29
Nie chcę mi się teraz grzebać na msdn aby coś udowadniać, ale kiedyś mnie coś nie działało i znalazłem czemu i jak rozwiązać (opisałem w poście powyżej). - _13th_Dragon 2011-03-18 11:12

Pozostało 580 znaków

2011-03-18 13:30
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.


I nie udawaj, że rozumiesz.
edytowany 2x, ostatnio: deus, 2011-03-18 13:32

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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