Jak przechwycić ruch kursora wewnątrz kontrolki innej niż okno główne?

0

Witam
Wie ktoś jak przechwycić ruch kursora wewnątrz innej kontrolki niż okno głowne?
Mam taki kod.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
       
        return 0;
    case WM_MOUSEMOVE:
        
        if ((HWND)hWnd == hEdit2) { DestroyWindow(hWnd); }
        SetCapture(hEdit2);
        
        //xPos = GET_X_LPARAM(lParam);
        GetCursorPos(&punkcik);
        
        tmp_str = std::to_string(punkcik.x);
        SetWindowTextA(hEdit2, tmp_str.c_str());
        ReleaseCapture();
        break;
        ...

I jak tutaj przechwycić komunikat do hEdit2 (kontrolka edit)?
Potrzebuję użyć głównej pętli komunikatów czy jakoś zagnieździć to wewnątrz tego kodu?
Tutaj oczekiwałbym, że jeśli parametr HWND hWnd jest hEdit2 to żeby usunęło główne okno, ale jak jak najeżdżam myszą to tracony jest "focus".
Dobra
Łapię kursor wewnątrz tej funkcji zawsze.
Teraz pytanie - czemu to nie działa?
Po najechaniu myszą na pole tekstowe i ruszaniu nią powinna się zmieniać zawartość tego pola.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if ((HWND)lParam == hEdit2  && (UINT)message == WM_MOUSEMOVE) {
       
      GetCursorPos(&punkcik);
      tmp_str = std::to_string(punkcik.x);
      SetWindowTextA(hEdit2,tmp_str.c_str());
   
    }
0

Jeśli chcesz sprawdzić, czy kursor jest nad edit boxem, to musisz w głównej pętli okna przechwicić pozycję i sprawdzić czy pokrywa się z pozycją edit boxa.

Tutaj oczekiwałbym, że jeśli parametr HWND hWnd jest hEdit2

Handle jest dla okna, nie dla pojedyńczej kontrolki, także ((HWND)hWnd == hEdit2) nigdy nie będzie prawdą.

Wie ktoś jak przechwycić ruch kursora wewnątrz innej kontrolki niż okno głowne?

Nie da się, bo kontrolki nie mają własnej pętl. Kontrolki wysyłają wiadomości do swojego rodzica, czyli okna, i potem w pętli okna możesz je przetwarzać.

0

@several: Masz rację, ALE mogłeś dodać, żeby sprawdzić "lParam", i że on już może być hEdit2. A z tym przechwyceniem kursora jest ok pomysł ok, tylko zdziwiło mnie, że w pętli switch przestaje przechwytywać pozycję kursora, dlatego pomyślałem, że kontrolka przejmuje nadzór nad myszą i tam sobie uruchamia własną pętle.
A jakie opcje daje grzebanie w translateMessage i dispachMessage?
A to ((UINT)message == WM_MOUSEMOVE) mi nie działa bo message jest kompilacją iluś zdarzeń tak?
A jeśli tak to jak zapisać coś takiego if( message.contains(WM_MOUSEMOVE) ){ }

0

@_13th_Dragon: Ten kodzik co podesłałeś link, zaczyna się od swicza, a to znaczy że pomija kontrolki. Dużo sensowniejsze jest to co sam spłodziłem do tej pory
bo tutaj nie wali cały czas odświeżaniem jak nic się nie dzieje a działa.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        GetCursorPos(&punkcik);
        xPos = punkcik.x;
        if (xPos != xPos2) {
                          tmp_str = std::to_string(punkcik.x);
                          SetWindowTextA(hEdit2, tmp_str.c_str());
                            }
xPos2 = xPos; //....
0

Ku wiedzy potomnych.
Jeśli kursor jest nad oknem Edit to zawartość tego okna wyświetla pozycję kursora(koordynaty x, y można łatwo dorobić).

struct tagPOINT punkcik;;
HWND hEdit2;   // uchwyt do okna edit
int xPos,xPos2;
string tmp_str;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
GetCursorPos(&punkcik);
        xPos = punkcik.x;
        if (xPos != xPos2) {

            RECT Rect;
            GetWindowRect(hEdit2, &Rect);
            if (xPos >= Rect.left && xPos <= Rect.right) {

            tmp_str = std::to_string(punkcik.x);
            SetWindowTextA(hEdit2, tmp_str.c_str());
        }
        }
    xPos2 = xPos;
    //... switch(message)
0
johnny_Be_good napisał(a):

@_13th_Dragon: Ten kodzik co podesłałeś link, zaczyna się od swicza, a to znaczy że pomija kontrolki.

To jest programowanie zdarzeniowe, musi być sprawdzenie, jakie zdarzenie wystąpiło.
W ramach nauki od Ciebie programowania przypadkowego sprawdziłem ten kod i nie działa. Wywala program z błędem.
Ale zobacz coś takiego:

HWND hEdit2;   // uchwyt do okna edit
int xPos, xPos2 = -1;

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
){  switch(message)
    { case WM_CREATE:
            hEdit2 = CreateWindowEx( 0, "Edit", "-1", WS_CHILD | WS_VISIBLE, 0, 0, 100, 50, hWnd, 0, 0, 0 );
            break;
      case WM_MOUSEMOVE:
        {   POINT punkcik;
            GetCursorPos( &punkcik );
            xPos = punkcik.x;
            if( xPos != xPos2 )
            {   RECT Rect;
                GetWindowRect( hEdit2, &Rect );
                if( xPos >= Rect.left
                && xPos <= Rect.right
                )
                {   string tmp_str = std::to_string( xPos );
                    SetWindowTextA( hEdit2, tmp_str.c_str() );
                }
                xPos2 = xPos;
            }
            break;
        }
      case WM_DESTROY:
            PostQuitMessage(0);
            break;
      default:
            return DefWindowProc( hWnd, message, wParam, lParam );
    }
    return 0;
}

Wtedy widać, że nie sprawdzasz wartości y i wpisuje do okna Edit tylko wtedy, gdy kursor nie jest nad tym oknem, a nad pozostałą przestrzenią okna nadrzędnego.

0

@overcq: Mój kod nie działa? Dawaj sprawdzimy, na to nie może być przyzwolenia. Jaki komunikat błędu Ci wyrzuca? Hm no ciekawe, ale wiesz, działanie poza obszarem switch jakoś tak lepiej mi wpływa na samopoczucie. Tak jakby inna swoboda działań.

0
Process exited after x seconds with return value 3221225477

Nie podejmuję się analizy tego, co się dzieje, ponieważ poza switch może dziać się cokolwiek: najprościej zapętlać się, ponieważ ustawiasz tam tekst okna, a to pewnie generuje jakieś kolejne zdarzenie.
Raczej zauważ, że jeśli najedziesz nad okno Edit, to nie uaktualnia pozycji.

0

@overcq: Masz cały kod ALE to jest wersja robocza.
Jakbyś wiedział przy okazjo czemu wybierając zaznaczenie elementu w listbox wyświetla mi jedynie pierwszą literę w kontrolce edit to by było super(w reakcji na klikniecie przycisku test).
A co jeśli napiszę własnego switch() ? Bo rozumiem ta funkcja uruchamiana jest zawsze.
Np. switch(lParam) ALBO switch( GetWindowTextA(hEdit2, tmp_str.c_str())) co Ty na to?
ewentualnie switch(GetSystemTime()) ? Albo switch(GetRegistryValue())? albo switch(HTTPRequest()) ?
Czy mógłbym wtedy używać zegara systemowego żeby sterować aplikacją?
Jedna by ustawiała czas w taki sposób, żeby druga odczytywała daną wartość i realizowała ustalone polecenia?
Czy to jest programowanie "przypadkowe"?

// WindowsProject9.cpp : Definiuje punkt wejścia dla aplikacji.
//

#include "framework.h"
#include "WindowsProject9.h"
#include <windowsx.h>
#include <winuser.h>
#define MAX_LOADSTRING 100
#define WM_MOUSEMOVE                    0x0200
#include <commctrl.h>
#include <string>
#include <safeint.h>
using namespace std;

wchar_t listBoxStr[15];
HWND hWndList,hWndExit;
// Zmienne globalne:
HINSTANCE hInst;    
                          // bieżące wystąpienie
WCHAR szTitle[MAX_LOADSTRING];                  // Tekst paska tytułu
WCHAR szWindowClass[MAX_LOADSTRING]; 


// nazwa klasy okna głównego
struct tagPOINT punkcik;
HWND hEdit2,hTstBtn;
int xPos,xPos2;
string tmp_str;
// Przekaż dalej deklaracje funkcji dołączone w tym module kodu:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK EdProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: W tym miejscu umieść kod.

    // Inicjuj ciągi globalne
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT9, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Wykonaj inicjowanie aplikacji:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT9));

    MSG msg;

    // Główna pętla komunikatów:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);

            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  FUNKCJA: MyRegisterClass()
//
//  PRZEZNACZENIE: Rejestruje klasę okna.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT9));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT9);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
    return RegisterClassExW(&wcex);
}

//
//   FUNKCJA: InitInstance(HINSTANCE, int)
//
//   PRZEZNACZENIE: Zapisuje dojście wystąpienia i tworzy okno główne
//
//   KOMENTARZE:
//
//        W tej funkcji dojście wystąpienia jest zapisywane w zmiennej globalnej i
//        jest tworzone i wyświetlane okno główne programu.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Przechowuj dojście wystąpienia w naszej zmiennej globalnej
  // dwStyle = ;
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
      0, 0, 1366, 768, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }
   HMENU hMenubar = CreateMenu();
   HMENU hFile = CreateMenu();
   HMENU hEdit = CreateMenu();
   HMENU hHelp = CreateMenu();

   AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hFile, L"File");
   AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hEdit, L"Edit");
   AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hHelp, L"Help");

   AppendMenu(hFile, MF_STRING, ID_Save, L"Save");
   AppendMenu(hFile, MF_STRING, ID_Load, L"Load");
   AppendMenu(hFile, MF_STRING, ID_Exit, L"Exit");

   AppendMenu(hEdit, MF_STRING, ID_Undo, L"Undo");
   AppendMenu(hEdit, MF_STRING, ID_Redo, L"Redo");

   AppendMenu(hHelp, MF_STRING, ID_VWS, L"Visit website");
   SetMenu(hWnd, hMenubar);
   
   hEdit2 = CreateWindowW(L"edit", NULL,
       WS_VISIBLE | WS_CHILD | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |ES_AUTOHSCROLL | ES_AUTOVSCROLL,
       106, 123, 355, 411, hWnd, NULL, NULL, NULL);
   
   hWndList = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("listbox"), L"", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL, 640, 40, 150, 220, hWnd, NULL, NULL, NULL);
   SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)L"name");
   SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)L"extension");
   SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)L"date");
   SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)L"size");
   hWndExit = CreateWindowEx(NULL, TEXT("button"), TEXT("Close"), WS_VISIBLE | WS_CHILD, 1300, 10, 66, 20, hWnd, NULL, NULL, NULL);

   hTstBtn = CreateWindowEx(NULL, TEXT("button"), TEXT("Test"), WS_VISIBLE | WS_CHILD, 1200, 10, 66, 20, hWnd, NULL, NULL, NULL);
   ShowWindow(hWnd, nCmdShow);
   ShowWindow(hEdit2, nCmdShow);
   ShowWindow(hWndExit, nCmdShow);
   UpdateWindow(hWnd);
   ShowWindow(hTstBtn, nCmdShow);
   return TRUE;
}

//
//  FUNKCJA: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PRZEZNACZENIE: Przetwarza komunikaty dla okna głównego.
//
//  WM_COMMAND  - przetwarzaj menu aplikacji
//  WM_PAINT    - Maluj okno główne
//  WM_DESTROY  - opublikuj komunikat o wyjściu i wróć
//
//
LRESULT CALLBACK EdProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

    switch (message)
    {
    case WM_MOUSEMOVE:
        SetCapture(hWnd);

        //xPos = GET_X_LPARAM(lParam);
        GetCursorPos(&punkcik);

        tmp_str = std::to_string(punkcik.x);
        SetWindowTextA(hEdit2, tmp_str.c_str());
        ReleaseCapture();
        break;

    }  
    return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    //if ((HWND)lParam == hEdit2){//} && (UINT)message == WM_MOUSEMOVE) {
  //  if ((HWND)lParam == hEdit2 && (UINT)message == WM_MOUSEMOVE || (UINT)message == WM_COMMAND ) {

        GetCursorPos(&punkcik);
        xPos = punkcik.x;
        if (xPos != xPos2) {

            RECT Rect;
            GetWindowRect(hEdit2, &Rect);
            if (xPos >= Rect.left && xPos <= Rect.right) {

            tmp_str = std::to_string(punkcik.x);
            SetWindowTextA(hEdit2, tmp_str.c_str());
        }
        }

  //  }
    xPos2 = xPos;
   
  // tmp_str = std::to_string(Rect.left);
   // SetWindowTextA(hEdit2, tmp_str.c_str());
   /*/ if ((UINT)message == WM_MOUSEMOVE) {
       
            GetCursorPos(&punkcik);
        
        tmp_str = std::to_string(punkcik.x);
        SetWindowTextA(hEdit2,tmp_str.c_str());
   //     return 0;
    }*/

   // if (message != WM_MOUSEMOVE) {

        


    //}
    switch (message)
    {
    case WM_CREATE:
       
        return 0;
    case WM_MOUSEMOVE:
       
       // if ((HWND)hWnd == hEdit2) { DestroyWindow(hWnd); }
        //SetCapture(hEdit2);
        
        //xPos = GET_X_LPARAM(lParam);
       // GetCursorPos(&punkcik);
        
      //  tmp_str = std::to_string(punkcik.x);
      //  SetWindowTextA(hEdit2, tmp_str.c_str());
        //ReleaseCapture();
      //  break;
    case WM_COMMAND:
        { //switch (LOWORD(wParam))
      //  {
       // case 106:
       //     SendMessageW(hWndList, LB_GETTEXT, 0, (LPARAM)listBoxStr);
       //     MessageBoxW(NULL, listBoxStr, L"", NULL);
      //      return 0;
      //  }


        if ((HWND)lParam == hTstBtn) {
             
            char z[20] = {"hhhhh"};
            LRESULT SelIndex;
            SelIndex = SendMessage(hWndList, LB_GETCURSEL, 0, 0L);
            tmp_str = std::to_string(SelIndex);
            SendMessage(hWndList, LB_GETTEXT, SelIndex, (LPARAM)z);
           // ListBox_GetText(hWndList, 0, (LPCSTR)&z[0]);
            SetWindowTextA(hEdit2, z);
        
        }
        if ((HWND)lParam == hWndExit) { DestroyWindow(hWnd); }

            int wmId = LOWORD(wParam);
            // Analizuj zaznaczenia menu:
            
         
            switch (wmId)
            {
            case ID_Exit:
                DestroyWindow(hWnd);
                break;
            case ID_Save:
                MessageBeep(0);
                break;
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps; 
            COLORREF rgbBlacka = 0x00000000;
            RECT rcPainta = { 0,20,1366,748 };
            ps.rcPaint = rcPainta;
            HBRUSH zz=CreateSolidBrush(rgbBlacka);

            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Tutaj dodaj kod rysujący używający elementu hdc...
            //SetBkColor(hdc, rgbBlacka);
           // FillRect(hdc, &rcPainta, zz);

            EndPaint(hWnd, &ps);
            //RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Procedura obsługi komunikatów dla okna informacji o programie.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
       
      
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
0

Funkcja WndProc (procedura okna) jest wywoływana przez Windows, gdy pojawi się jakieś zdarzenie okna. To zdarzenie jest przechowywane w parametrze message. Dlatego ten switch sprawdzający, jakie zdarzenie wystąpiło, że procedura okna została wywołana.
Bez tego sprawdzenia, jakie zdarzenie wystąpiło, wykonuje się kod w odpowiedzi na jakiekolwiek zdarzenie, a to jest bez sensu.
Mógłbyś czytać czas, ale to nie zmusi Windowsa do innego wysyłania zdarzeń niż te, które się pojawiają dla okna.

U mnie wyświetla pełną nazwę zaznaczenia. Ale nie używam Twojego kodu, tylko zmodyfikowałem na własny, uproszczony:

#include <windows.h>
// Poniższe procedury pochodzą z mojej biblioteki, więc dlatego tutaj typedef.
typedef char *Pc;
typedef unsigned N;

Pc
E_text_Z_n_N_s( Pc s_end
, N n
, N l
, N base
){  do
    {   N k = n % base;
        *--s_end = k < 10
        ? '0' + k
        : 'A' + k - 10;
    }while( n /= base );
    return s_end;
}
N
E_text_Z_n_N_s_G( N n
, N l
, N base
){  N i = 0;
    do
    {   i++;
    }while( n /= base );
    return i;
}

POINT punkcik;
HWND hEdit2, hWndList, hTstBtn;
int xPos, xPos2 = 0;

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{   switch(Message) {
		case WM_CREATE:
		    hEdit2 = CreateWindowEx( 0, "Edit", "-1", WS_CHILD | WS_VISIBLE, 0, 0, 100, 50, hwnd, 0, 0, 0 );
		    hWndList = CreateWindowEx( WS_EX_CLIENTEDGE, "listbox", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL, 0, 200, 150, 220, hwnd, 0, 0, 0 );
		    SendMessage( hWndList, LB_ADDSTRING, 0, "name" );
		    SendMessage( hWndList, LB_ADDSTRING, 0, "extension" );
		    SendMessage( hWndList, LB_ADDSTRING, 0, "date" );
		    SendMessage( hWndList, LB_ADDSTRING, 0, "size" );
		    hTstBtn = CreateWindowEx( 0, "button", "Test", WS_VISIBLE | WS_CHILD, 300, 10, 66, 20, hwnd, 0, 0, 0 );
		    break;
		case WM_COMMAND:
		    if ( lParam == hTstBtn )
            {   char z[20] = {"hhhhh"};
		        LRESULT SelIndex = SendMessage(hWndList, LB_GETCURSEL, 0, 0L);
		        SendMessage( hWndList, LB_GETTEXT, SelIndex, (LPARAM)z );
		        SetWindowTextA( hEdit2, z );
		    }
		    break;
		case WM_MOUSEMOVE:
            GetCursorPos(&punkcik);
            xPos = punkcik.x;
            if (xPos != xPos2)
            {   RECT Rect;
                GetWindowRect(hEdit2, &Rect);
                if (xPos >= Rect.left && xPos <= Rect.right)
                {   N l = E_text_Z_n_N_s_G( xPos, sizeof( xPos ), 10 );
                    Pc tmp_str = malloc( l + 1 );
                    tmp_str[l] = '\0';
                    E_text_Z_n_N_s( &tmp_str[l], xPos, sizeof( xPos ), 10 );
                    SetWindowText( hEdit2, tmp_str );
                    free( tmp_str );
                }
                xPos2 = xPos;
            }
            break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		
		/* All other messages (a lot of them) are processed using default procedures */
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG msg; /* A temporary location for all messages */

	/* zero out the struct and set the stuff we want to modify */
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, /* x */
		CW_USEDEFAULT, /* y */
		640, /* width */
		480, /* height */
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	/*
		This is the heart of our program where all input is processed and 
		sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
		this loop will not produce unreasonably high CPU usage
	*/
	while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&msg); /* Translate key codes to chars if present */
		DispatchMessage(&msg); /* Send it to WndProc */
	}
	return msg.wParam;
}
0

@overcq: ale nie pisz, że mój kod nie działa. Bo to nieprawda.
"Mógłbyś czytać czas, ale to nie zmusi Windowsa do innego wysyłania zdarzeń niż te, które się pojawiają dla okna." - ale to by nie miało najmniejszego znaczenia bo komunikacja by szła za pomocą czasu. Tak jak masz kod ascii i tam 77 znaczy M , tak np, miesiąc wrzesień by oznaczał "pobierz zmienną z okna wlasnego okna edit". I oczywiście ten miesiąc byłby ustawiany na sekunde, a potem znowu zmieniany przez aplikację sterującą. Ile bitów w tej zmiennej czas tyle możliwości. No i nie zapominając o kombinacjach tych różnych bitów.

0

O kodzie napisałem dwie rzeczy:

  1. Wywala program z błędem (bo się zapętla?).
  2. Nawet jeśli się go poprawi do WM_MOUSEMOVE, to nie reaguje, gdy kursor znajduje się nad kontrolką (a tylko pod nią lub nad nią).

Oczywiście, że można by zrobić taki system, jak piszesz, ale nikt tego nie robi, ponieważ nazywa się rzeczy wprost tym, czym są, a nie koduje niepotrzebnie…

0

Piszesz na zmiane różne rzeczy 1)

"Process exited after x seconds with return value 3221225477
Nie podejmuję się analizy tego, co się dzieje, ponieważ poza switch może dziać się cokolwiek: najprościej zapętlać się, ponieważ ustawiasz tam tekst okna, a to pewnie generuje jakieś kolejne zdarzenie.
Raczej zauważ, że jeśli najedziesz nad okno Edit, to nie uaktualnia pozycji." 

Napisałeś to zanim wysłałem kompletny kod.
Skompilowałeś fragment i twierdzisz, że nie działa.
Tu masz zdjęcie tego skompilowanego programu (sprzed sekundy).
Co sugerujesz?111111a.jpg

0

Zanim wysłałeś kompletny kod, to pisałem odnośnie tematu. Te dwa punkty są właśnie o tym: jak przechwycić ruch kursora nad oknem Edit. I to nie działa, napisałem dlaczego.
Następnie pytałeś o to, dlaczego wyświetla tylko pierwszą literę, więc napisałem, że u mnie działa i podesłałem kod.

0

@overcq: Różnica jest taka, że to właśnie mój kod działa a Twój sypie tym.

  1. Jak wkleisz kod który Ci "nie działa" bym skompilował i poprawił, ale poza samym stwierdzeniem że coś nie działa nie popierasz teh wypowiedzi żadnymi dowodami.
  2. Po co wklejasz kod który nie działa?
    Ludzie stracą czas próbując to skompilować.
1>WindowsProject9.cpp
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(42,12): error C2664: „HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)”: nie można dokonać konwersji argumentu 2 z „const char [5]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(42,30): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(4433,1): message : zobacz deklarację „CreateWindowExW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(42,12): message : podczas próby dopasowania listy argumentów "(int, const char [5], const char [3], long, int, int, int, int, HWND, int, int, int)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(43,14): error C2664: „HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)”: nie można dokonać konwersji argumentu 2 z „const char [8]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(43,47): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(4433,1): message : zobacz deklarację „CreateWindowExW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(43,14): message : podczas próby dopasowania listy argumentów "(long, const char [8], const char [1], long, int, int, int, int, HWND, int, int, int)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(44,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const char [5]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(44,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(44,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const char [5])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(45,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const char [10]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(45,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(45,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const char [10])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(46,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const char [5]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(46,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(46,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const char [5])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(47,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const char [5]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(47,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(47,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const char [5])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(48,13): error C2664: „HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)”: nie można dokonać konwersji argumentu 2 z „const char [7]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(48,31): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(4433,1): message : zobacz deklarację „CreateWindowExW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(48,13): message : podczas próby dopasowania listy argumentów "(int, const char [7], const char [5], long, int, int, int, int, HWND, int, int, int)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(51,14): error C2446: "==": brak konwersji z "HWND" na "LPARAM"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(51,17): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(69,16): error C2440: "inicjowanie": nie można konwertować z "void *" na "Pc"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(69,16): message : Konwersja z typu "void *" na wskaźnik do typu innego niż "void" wymaga jawnego rzutowania
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(72,5): error C2664: „BOOL SetWindowTextW(HWND,LPCWSTR)”: nie można dokonać konwersji argumentu 2 z „Pc” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(72,27): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(8910,1): message : zobacz deklarację „SetWindowTextW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(72,5): message : podczas próby dopasowania listy argumentów "(HWND, Pc)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(104,21): error C2440: "=": nie można konwertować z "const char [12]" na "LPCWSTR"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(104,21): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(109,3): error C2664: „int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)”: nie można dokonać konwersji argumentu 2 z „const char [28]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(109,20): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(9161,1): message : zobacz deklarację „MessageBoxW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(109,3): message : podczas próby dopasowania listy argumentów "(int, const char [28], const char [7], long)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(113,9): error C2664: „HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)”: nie można dokonać konwersji argumentu 2 z „const char [12]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(113,42): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(4433,1): message : zobacz deklarację „CreateWindowExW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(113,9): message : podczas próby dopasowania listy argumentów "(long, const char [12], const char [8], long, int, int, int, int, int, int, HINSTANCE, int)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(121,3): error C2664: „int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)”: nie można dokonać konwersji argumentu 2 z „const char [24]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(121,20): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(9161,1): message : zobacz deklarację „MessageBoxW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(121,3): message : podczas próby dopasowania listy argumentów "(int, const char [24], const char [7], long)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(134,12): warning C4244: "return": konwersja z "WPARAM" do "int", możliwa utrata danych
1>Kompilowanie projektu „WindowsProject9.vcxproj” wykonane — NIEPOWODZENIE.
========== Kompilacja: sukces — 0, niepowodzenie — 1, aktualne — 0, pominięto — 0 ==========
========== upłynęło 00:05,849 =========
0

Masz projekt używający funkcji W(idechar), a mój domyślnie A(nsi)? Dodaj sobie na początku tekstów L lub co uważasz za stosowne.
Aha odnośnie tego, że nie działa: przesuń wskaźnik myszy nad okno Edit i poruszaj w prawo i w lewo. Nie będzie podawał aktualnej pozycji.

0

No u mnie pokazuje pozycję kursora na osi x nad oknem edit, pod oknem edit, w oknie edit.
"Masz projekt używający funkcji W(idechar), a mój domyślnie A(nsi)?" - wiesz ile czasu spedzilem zeby zamieniac wszystko na zwykle znaki (te jedno bajtowe)?
Jak widzisz w kodzie funkcję SetWindowTextA(hEdit2, tmp_str.c_str()); - po co tam na końcu A?

"Dodaj sobie na początku tekstów L" -dodałem

Rozpoczęto kompilację...
1>------ Kompilacja rozpoczęta: Projekt: WindowsProject9, Konfiguracja: Debug x64 ------
1>WindowsProject9.cpp
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(43,14): error C2664: „HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)”: nie można dokonać konwersji argumentu 3 z „const char [1]” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(43,59): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(4433,1): message : zobacz deklarację „CreateWindowExW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(43,14): message : podczas próby dopasowania listy argumentów "(long, const wchar_t [8], const char [1], long, int, int, int, int, HWND, int, int, int)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(44,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const wchar_t [5]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(44,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(44,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const wchar_t [5])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(45,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const wchar_t [10]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(45,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(45,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const wchar_t [10])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(46,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const wchar_t [5]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(46,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(46,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const wchar_t [5])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(47,3): error C2664: „LRESULT SendMessageW(HWND,UINT,WPARAM,LPARAM)”: nie można dokonać konwersji argumentu 4 z „const wchar_t [5]” do „LPARAM”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(47,42): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(3699,1): message : zobacz deklarację „SendMessageW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(47,3): message : podczas próby dopasowania listy argumentów "(HWND, int, int, const wchar_t [5])"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(51,14): error C2446: "==": brak konwersji z "HWND" na "LPARAM"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(51,17): message : Brak kontekstu, w którym ta konwersja jest możliwa
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(69,16): error C2440: "inicjowanie": nie można konwertować z "void *" na "Pc"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(69,16): message : Konwersja z typu "void *" na wskaźnik do typu innego niż "void" wymaga jawnego rzutowania
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(72,5): error C2664: „BOOL SetWindowTextW(HWND,LPCWSTR)”: nie można dokonać konwersji argumentu 2 z „Pc” do „LPCWSTR”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(72,27): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winuser.h(8910,1): message : zobacz deklarację „SetWindowTextW”
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(72,5): message : podczas próby dopasowania listy argumentów "(HWND, Pc)"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(104,21): error C2440: "=": nie można konwertować z "const char [12]" na "LPCWSTR"
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(104,21): message : Wskazane typy nie są powiązane; konwersja wymaga operatora reinterpret_cast, rzutowania w stylu języka C lub rzutowania w stylu funkcji ujętego w nawiasach
1>K:\VC++_projects\WindowsProject9\WindowsProject9.cpp(134,12): warning C4244: "return": konwersja z "WPARAM" do "int", możliwa utrata danych
1>Kompilowanie projektu „WindowsProject9.vcxproj” wykonane — NIEPOWODZENIE.
========== Kompilacja: sukces — 0, niepowodzenie — 1, aktualne — 0, pominięto — 0 ==========
========== upłynęło 00:05,032 =========
0

Ale masz na przykład:

hWndList = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("listbox"), L"", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL, 640, 40, 150, 220, hWnd, NULL, NULL, NULL);

I jeśli masz zdefiniowane UNICODE, to wtedy podstawia CreateWindowExW.

0

Dobrze podsumujmy.

  1. Twierdzisz że mój kod nie działa chociaż boisz się go skompilować.
  2. Nie podejmujesz się go analizować.
  3. Wklejasz kod który uruchomi się tylko u niektórych użytkowników.
  4. I dalej w zaparte idziesz że to prostu nie działa bo nie:
"Zanim wysłałeś kompletny kod, to pisałem odnośnie tematu. Te dwa punkty są właśnie o tym: jak przechwycić ruch kursora nad oknem Edit. 
I to nie działa, napisałem dlaczego.
Następnie pytałeś o to, dlaczego wyświetla tylko pierwszą literę, więc napisałem, że u mnie działa i podesłałem kod."

Z taką argumentacją nie czuje się na siłach polemizować.

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