Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] sendmessage nie wysyła

Ostatnio zmodyfikowano 2011-03-07 21:02
Autor Wiadomość
mefiu512
Temat założony przez niniejszego użytkownika
[WinApi] sendmessage nie wysyła
» 2011-03-06 20:58:15
Witam.
To mój pierwszy post na tym forum (proszę o wyrozumiałość) :)
Programuję już trochę(łącznie jakiś rok), i mam problem z funkcją sendmessage(). Funkcja nie chce wysyłać :) Wiem, że Wam to nic nie mówi, więc od razu zamieszczam kod.
C/C++
#include <windows.h>

using namespace std;

int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine, int CmdShow )
{
   
    HWND hnotepad = FindWindow( "Notepad", NULL ); //jak daje notepad.exe to też nie idzie
    if( !hnotepad ) MessageBox( hnotepad, "FAIL", "Komunikat", MB_OK );
   
    SendMessage( hnotepad, WM_CHAR, 65, 0 );
}

Włączam notatnik, następnie program i nic.
Proszę o pomoc.
P-28928
malan
» 2011-03-06 21:03:26
Otwórz sobie notatki i zobacz jaki tytuł ma okno :)
P-28929
mefiu512
Temat założony przez niniejszego użytkownika
» 2011-03-06 21:06:42
No więc tak:
Bez tytułu - Notatnik = nie łączy
Notatnik = nie łączy
Notepad/notepad = łączy, ale nie wysyła
notepad.exe = nie łączy

dalej nie wiem...
P-28930
malan
» 2011-03-06 21:11:45
Też kiedyś nad tym się głowiłem ;p.
Bez tytułu - Notatnik
Pomiędzy
Bez tytułu
, a
Notatnik
 jest (chyba) jakiś niestandardowy znak. To nie jest (moim zdaniem)
-
 ;p

Spróbuj pobrać tą nazwę okna może ;)
P-28931
mefiu512
Temat założony przez niniejszego użytkownika
» 2011-03-06 21:24:50
Tutaj musi być problem z samą funkcją. Bo jak napisze "notatnik" to łączy(nie wyświetla się komunikat),ale nie wysyła.Jak pobrać nazwę? w taskmenager?
Bo jak w taskmenager to jest napisane "notepad.exe" - a tak nie wysyła a nawet nie łączy. 
P-28932
malan
» 2011-03-06 21:28:35
Kombinuj ;p. Ja już nazwę mam pobraną ;p

/edit:
Dobra. Mam wszystko. Teraz mogę Ci powiedzieć z całą pewnością, że to co masz aktualnie zrobione to 2/3 roboty :)
P-28933
mefiu512
Temat założony przez niniejszego użytkownika
» 2011-03-07 19:44:38
Dzięki za pomoc. Już mam :)
Okazało się, że nie połączyłem się z editem tzn. z oknem wyświetlania tekstu, tylko z samym notatnikiem.
Zamieszczam kod wraz z opisem, dla innych :)  
C/C++
#include <windows.h> //dołączamy biblioteke

int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine, int CmdShow ) //standard
{
   
    HWND notepad = FindWindow( "Notepad", NULL ); //łączymy nasz program z notatnikiem
    HWND notepadchild = FindWindowEx( notepad, NULL, "Edit", NULL );
    //odwiedzamy "dziecko" notanika tzn, łączymy się z oknem wyświetlania danych - "Edit"
    if( !notepad ) MessageBox( notepad, "FAIL", "notepad fail", MB_OK ); //jak nie połączyło - komuniakt
   
    if( !notepadchild ) MessageBox( notepad, "FAIL", "notepadchild fail", MB_OK ); // jak wyżej
   
    SendMessage( notepadchild, WM_CHAR, 65, 0 ); //sprawdzamy czy działa funckja sendmessage
    PostMessage( notepadchild, WM_CHAR, 65, 0 ); //sprawdzamy czy działa funckja postmessage
}
Temat zamykam i pozdrawiam.
P-28985
malan
» 2011-03-07 21:02:37
To ja tylko jeszcze wtrącę dwa słowa od siebie ;p
C/C++
#include <iostream>
#include <Windows.h>

const char message[] = "Hi...\nMy name is malan.\nI was looking for you.\nCome with me...";

int main()
{
    char * windowTitle = 0;
   
    Sleep( 5 * 1000 );
   
    HWND notepadWindowHandle = GetForegroundWindow();
    if( !notepadWindowHandle )
    {
        MessageBoxA( 0, "GetForegroundWindow function error!", "Error", MB_OK | MB_ICONERROR );
        return 1;
    }
   
    DWORD windowTitleLength = GetWindowTextLength( notepadWindowHandle ) + 1;
   
    windowTitle = new char[ windowTitleLength ];
    memset( windowTitle, '\0', windowTitleLength );
   
    if( !GetWindowTextA( notepadWindowHandle, windowTitle, windowTitleLength ) )
    {
        MessageBoxA( 0, "GetWindowText function error!", "Error", MB_OK | MB_ICONERROR );
        return 1;
    }
   
    std::cout << windowTitle << std::endl;
   
    HWND notepadEditControlHandle = FindWindowExA( notepadWindowHandle, 0, "EDIT", 0 );
    if( !notepadEditControlHandle )
    {
        MessageBoxA( 0, "FindWindowEx function error!", "Error", MB_OK | MB_ICONERROR );
        return 1;
    }
   
    for( std::size_t i = 0; i < strlen( message ); ++i )
    {
        SendMessage( notepadEditControlHandle, WM_CHAR, message[ i ], 0 );
       
        Sleep(( message[ i ] == '\n' ) ? 650
            : 300 );
    }
   
    delete[] windowTitle;
}
1. Otwórz notatnik.
2. Skompiluj i uruchom program.
3. Jak najszybciej (w ciągu pięciu sekund ;p) kliknij na ikonę notatnika na dolnym pasku ;p

Oczywiście po małej modyfikacji tego kodu obejdzie się bez punktu trzeciego, ale to już każdy niech zrobi według własnego uznania :).
P-28988
« 1 »
  Strona 1 z 1