Last Updated 2002/10/08
Programming Tips Visual C++ API  索 引 
GetWindowTextとエディットボックス
2002/10/08

GetWindowText() を呼び出すと WM_GETTEXT メッセージが送られるとヘルプには記述してある.しかし GetWindowText ではエディットボックスの内容は取得できない.(取得できない条件は後述)

ダイアログのエディットコントロールの内容を取得するコードは以下.

    HWND hWnd, hEditWnd;
    
    char sNo[20];
    hWnd = ::FindWindow(NULL, "PreMenu");
    hEditWnd = ::GetDlgItem(hWnd, ID_EDIT);
    ::GetWindowText(hEditWnd, sNo, 19);
    ::SendMessage(hEditWnd, WM_GETTEXT, 19, (LPARAM)sNo);

SendMessage では内容が取得出来るが,GetWindowText では失敗する.
GetLastError は 1447L ERROR_NO_SCROLLBARS を示す.

同様に GetDlgItemText() をしてもエディットボックスの内容は取得できない.

なぜ GetWindowText() や GetDlgItemText() で内容が取得できないのか?
別プロセスからだと取得できない.同プロセスからなら取得可能である.
(他のプロセスからは WM_GETTEXT を SendMessage() するしかない)

SetWindowText() をしてみると成功して,GetWindowText() で設定した文字列を取得できるがエディットボックスの内容は変化しない.
以下のような関係である.

エディットの内容 "1234"
SetWindowText            "9876"
GetWindowText            "9876"
WM_GETTEXT       "1234"

エディットボックスに関しては GetWindowText() と WM_GETTEXT で動作が違うということになる.
GetWindowText をすると WM_GETTEXT を投げると書いてあるヘルプが間違いなのである.
(別プロセスの場合,SPY++ で見ても GetWindowText() してもメッセージは飛ばない)
(同プロセスの場合は WM_GETTEXT が飛ぶ)

エディットコントロールに関してはタイトル文字を取得ではなく,内部にメモリハンドルなどを持ちエディット内容を保持していると思われる.
GetWindowText(), SetWindowText() はタイトル文字を扱うが,WM_GETTEXT に関してはエディットコントロールが内部で処理している可能性が高い.


参照
前後のTips
GetWindowTextとエディットボックス

DSS ProgrammingTipsCGI Ver2.01