как узнать произошло ли нажатие на кнопку в чужом окне(приложении)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DIM969, 18 Dec 2010.

  1. DIM969

    DIM969 New Member

    Joined:
    17 Dec 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Ситуация следующая:беру хэндл чужого окна и создаю в нем кнопку:
    wnd = FindWindow(NULL, "Калькулятор Плюс");
    CreateWindow("button", "sqrt", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,230, 60, 30, 30, wnd, (HMENU)10000, NULL, NULL);
    теперь мне надо назначить ей обработчик,а вот как это как раз вопрос?
    Заранее спасибо.
    P.S.тема так называется так как это мое предположение о том как реализовать этот обработчик
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Сабклассинг и прочие фишки связанные с этим
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Сабклассинг окна
    Code:
    // в .h файле или выше
    LONG oldfunc;
    LRESULT CALLBACK MyBtnProc (HWND,UINT,UINT,LONG);
    
    // в коде
    LRESULT CALLBACK MyBtnProc(HWND hWnd,UINT Message, UINT wParam, LONG lParam)
    {
    	switch (Message)  { ... }
    	if (CallWindowProc((WNDPROC)oldfunc, hWnd, Message, wParam, lParam)) return DefWindowProc(hWnd, Message, wParam, lParam);
    	return 0;
    }
    
    // --------- там где ты делаешь кнопку
    hButton=CreateWindow("button", "sqrt", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,230, 60, 30, 30, wnd, (HMENU)10000, NULL, NULL);
    oldfunc=SetWindowLong(hButton, GWL_WNDPROC, (LONG)&MyBtnProc);
    
     
    _________________________
  4. DIM969

    DIM969 New Member

    Joined:
    17 Dec 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Большое спасибо за код,сделал как описано(первый раз сталкиваюсь с подобными вещами)но компилятор ругается сразу после
    if (CallWindowProc((WNDPROC)oldfunc, hWnd, Message, wParam, lParam))
    выдает 2 ошибки:
    1) [C++ Error] Unit1.cpp(45): E2034 Cannot convert 'long (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
    2) [C++ Error] Unit1.cpp(45): E2342 Type mismatch in parameter 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(void *,unsigned int,unsigned int,long)')