0

クリックすると、別のアプリケーションのウィンドウのタイトルがメッセージ ボックスに表示されるダイアログ ベースの MFC ツールを入手しました。私の問題は、ここで WM_KILLFOCUS が機能しないことです。多分私はそれを間違っています。私は次のことを行います:

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_WM_KILLFOCUS()
END_MESSAGE_MAP()

...
...

void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m_bSelectorModeActive)
    {
        HWND hwnd(GetForegroundWindow());
        TCHAR buf[512];
        ::GetWindowText(hwnd, buf, 512);
        MessageBox(buf);
    }
}

何が問題なのですか?

4

3 に答える 3

0

これは私の推測です

HWND を置き換える hwnd(GetForegroundWindow()); GetActiveWindow(void) で。

于 2011-02-17T11:29:18.083 に答える
0

あなたが示したコードはコンパイルさえすべきではありません。GetForegroundWindowMFC が提供する関数は を返さないため、戻り値を使用して変数をHWND初期化することはできません。hwnd

を取得したい場合は、 の場合と同様に、 で呼び出しをエスケープして Windows API からHWND呼び出す必要があります。したがって、コードを次のように書き換えるだけです。GetForegroundWindow::GetWindowText

void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m_bSelectorModeActive)
    {
        HWND hwnd(::GetForegroundWindow());
        TCHAR buf[512];
        ::GetWindowText(hwnd, buf, 512);
        MessageBox(buf);
    }
}

それ以上に、あなたのコードを見ると、オブジェクト指向 MFC を無視しているように見えて、謙虚に Windows API に持ち込もうとしていることに驚きます。ウィンドウ ハンドルを直接操作する必要はありません。MFC を使用する最も説得力のある理由は、そのCStringクラスであると主張する人もいるでしょう。もう s の配列を扱わなければならない理由はありTCHARません。代わりにこれを書くかもしれません:

void CMyDlg::OnKillFocus( CWnd* pNewWnd )
{
    CDialog::OnKillFocus(pNewWnd);
    if(m_bSelectorModeActive)
    {
        CWnd* pForeWnd = GetForegroundWindow();
        CString windowText;
        pForeWnd->GetWindowText(windowText);
        MessageBox(windowText);
    }
}
于 2011-02-17T11:35:23.567 に答える
0

私はそれを解決しました、あなたの努力に感謝します。

はい、私は CStrings を使用しています。これは、私が行うもう少し複雑なことのほんの一例です。私の問題は関数自体ではなく、動作していないように見えるイベント WM_KILLFOCUS でした。多分私はここで十分に明確ではありませんでした、申し訳ありません。

WM_ACTIVATE は私が必要とすることを行います。フォーカスが設定されたり失われたりすると、ダイアログに通知します。

于 2011-02-17T11:45:50.807 に答える