Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как узнать что форма находиться в фокусе?


Автор: Alca 28.10.2009, 14:42
Как узнать что форма находиться в фокусе?

Автор: mrbrooks 28.10.2009, 15:03
TApplicationEvents - событие OnActivate

Автор: Alca 28.10.2009, 17:30
Делаю так:
Код

/****************************************************************************
* TfrmInputCaptcha - ввод каптчи
*
*****************************************************************************/

//--------------------------------------------------------------------------- 
#ifndef uInputCaptchaH
#define uInputCaptchaH
//--------------------------------------------------------------------------- 
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

#include "uMain.h"
#include <Buttons.hpp>
#include <ExtCtrls.hpp>      //frmMain
//--------------------------------------------------------------------------- 
class TfrmInputCaptcha : public TForm {
    __published:
        TImage *imgCaptcha;
        TBitBtn *btnCancel;
        TBitBtn *btnOk;
        TEdit *edtCaptcha;
        TLabel *Label1;
        TTimer *tmrFlashWindow;

        void __fastcall btnOkClick         (TObject *Sender);
        void __fastcall btnCancelClick     (TObject *Sender);
        void __fastcall tmrFlashWindowTimer(TObject *Sender);

    public:
        __fastcall      TfrmInputCaptcha   (TComponent* Owner, TMemoryStream *pmsMS);

    private:
        //фокус
        void __fastcall             vOnActivate          (TWMActivate &a);
        BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_ACTIVATE,   TWMActivate, vOnActivate)
        END_MESSAGE_MAP(TForm)
};
//--------------------------------------------------------------------------- 
#endif





/****************************************************************************
* TfrmInputCaptcha - ввод каптчи
*
*****************************************************************************/

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "uInputCaptcha.h"    //frmInputCaptcha
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
//DONE: конструктор
__fastcall TfrmInputCaptcha::TfrmInputCaptcha(TComponent *Owner, TMemoryStream *pmsMS) :
    TForm(Owner)
{
    /*DEBUG*/XASSERT(NULL != pmsMS);

    tmrFlashWindow->Interval = 500;
    tmrFlashWindow->Enabled  = true;
}
//---------------------------------------------------------------------------
//TODO: мигание в панели задач
void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {
    ::FlashWindow(Application->Handle, true);
}
//---------------------------------------------------------------------------
//TODO: фокус формы
void __fastcall TfrmInputCaptcha::vOnActivate(TWMActivate &a) {
    if (WA_INACTIVE == a.Active) {
        //покинули форму

    } else {
        //активировали форму
     ShowMessage(_T("активировали форму"));  //<<<<<< форма еще не получила фокус, а мсжбокс вывалился
        tmrFlashWindow->Enabled = false;

        a.Result = 0;
    }
}
//---------------------------------------------------------------------------

Нажимая кнопку из главной формы ("Старт") , при создании дочекрней формы запускается таймер.
Пока он не сработал "кладу" форму на под какое-нибудь окно (т.е. форма не имеет фокуса).
Вроде бы дочерняя форма фокуса не получала, но мсжбокс вываливатся (см. код).

Добавлено через 10 минут и 11 секунд
Получилось так:
Код

//TODO: мигание в панели задач
void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {
    HWND          hWnd                 = NULL;
    TCHAR         szBuff[MAX_PATH + 1] = {0};
    const tString csWndText            = Caption;

    hWnd = ::GetForegroundWindow();
    int iSize = ::GetWindowText(hWnd, szBuff, MAX_PATH);

    if (csWndText == tString(szBuff, iSize)) {
        tmrFlashWindow->Enabled = false;         

        return;
    }

    ::FlashWindow(Application->Handle, true);
}

Автор: dumb 29.10.2009, 00:32
а чем не устроил обычный frmInputCaptcha->Focused()?

Автор: Alca 29.10.2009, 00:45
Цитата

а чем не устроил обычный frmInputCaptcha->Focused()?

Тем, что не работает (скока не клацал по форме):
Код

void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {
    HWND          hWnd                 = NULL;
    TCHAR         szBuff[MAX_PATH + 1] = {0};
    const tString csWndText            = Caption;

    hWnd = ::GetForegroundWindow();
    /*DEBUG*///not need

    int iSize = ::GetWindowText(hWnd, szBuff, MAX_PATH);
    /*DEBUG*///not need

    if (Focused() == true/*csWndText == tString(szBuff, iSize)*/) {
        tmrFlashWindow->Enabled = false;

        return;
    }

    ::FlashWindow(Application->Handle, true);
}

Автор: dumb 29.10.2009, 02:36
а, пардон, один из контролов на этой форме будет иметь Focused() = true.
а нужная тебе проверка: if (Screen->ActiveForm == this)

Автор: Alca 29.10.2009, 10:43
Цитата

а, пардон, один из контролов на этой форме будет иметь Focused() = true.
а нужная тебе проверка: if (Screen->ActiveForm == this)

Та же фигня, что и с WA_INACTIVE  smile 
Код
//---------------------------------------------------------------------------
//DONE: конструктор
__fastcall TfrmInputCaptcha::TfrmInputCaptcha(TComponent *Owner, TMemoryStream *pmsMS) :
    TForm(Owner)
{
    tmrFlashWindow->Interval = 500;

    ActiveControl = edtCaptcha;

    tmrFlashWindow->Enabled  = true;
}
//---------------------------------------------------------------------------
//TODO: мигание в панели задач
void __fastcall TfrmInputCaptcha::tmrFlashWindowTimer(TObject *Sender) {

    if (Screen->ActiveForm == this) {
        tmrFlashWindow->Enabled = false;

        return;
    }

    ::FlashWindow(Application->Handle, true);
}
//---------------------------------------------------------------------------
void __fastcall TfrmInputCaptcha::FormShow(TObject *Sender) {
    edtCaptcha->SetFocus();
}
//---------------------------------------------------------------------------


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)