チャットソフトを製作しているのですが、エディットボックスに入力したものをENTERを押してリストボックスに送るということがうまくいきません。
case WM_KEYDOWN:
switch(wp)
{
case VK_RETURN:
これを使うんだと思いますが、どうもうまくいきません。
FocusがEDITboxにきていないのが原因だと思うのですが・・・。
ご教授お願いいたします。
書き忘れましたが、使用ソフトはVC++(ver6.0)です。
よろしくお願いします。
もし的外れだったらごめんなさい。
MFCを使用されているのなら、エディットボックスの親ウィンドウの
PreTranslateMessageを使用してみたらどうでしょうか?
↓こんなかんじ-------------------------------------------
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
if (pMsg->message==WM_KEYDOWN
&& pMsg->wParam==VK_RETURN
&& pMsg->hwnd==GetDlgItem(IDC_EDIT1)->m_hWnd)
{
CString str;
GetDlgItem(IDC_EDIT1)->GetWindowText(str);
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(str);
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
-------------------------------------------
ぴのきよさん、書き込みありがとうございます!
あ〜、すみません。MFCは使わないで、APIを使って作っています。
書くの忘れててすみません。。
エディットコントロールのスタイルにES_MULTILINEを追加すれば、
WM_KEYDOWNでとれるみたいです。
それか、メッセージループでディスパッチする前に捕まえるとか・・・。
一緒に勉強させて頂いてます。
//エディットコントロールのスタイルにES_MULTILINEを追加すれば、
//WM_KEYDOWNでとれるみたいです。
書き込みありがとうございます!
やってみましたがどうもうまくできませんでした。プログラムを起動して何もしないうちにENTERを押すと認識してるみたいなんですが、EDITボックスにフォーカスがあたっていると認識してくれないんですよね〜。
//一緒に勉強させて頂いてます。
私もやり始めたばっかりでぜんぜん理解できてないです^^;
これでそれらしく動いてますが・・・。
どうでしょうか?
-----------------------------------------------------------------
#include "StdAfx.h"
#include "Resource.h"
BOOL CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK HatugenProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
WNDPROC hHatugenEditProc;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
// TODO: この位置にコードを記述してください。
if (DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG),
NULL, (DLGPROC)MainDlgProc) == -1)
return -1;
return FALSE;
}
BOOL CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hEdit;
switch(uMsg)
{
case WM_INITDIALOG:
// エディットコントロールのサブクラス化
hEdit = GetDlgItem(hwndDlg, IDC_ED_HATUGEN);
hHatugenEditProc = (WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC);
SetWindowLong(hEdit, GWL_WNDPROC, (LONG)HatugenProc);
return TRUE;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDCANCEL:
PostQuitMessage(0);
break;
}
}
return FALSE;
}
LRESULT CALLBACK HatugenProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_KEYDOWN:
if ((int)wParam==VK_RETURN)
{
char szMsg[512];
GetWindowText(hwnd, szMsg, sizeof(szMsg)-1);
HWND hList = GetDlgItem(GetParent(hwnd), IDC_LST_LOG);
SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)szMsg);
SetWindowText(hwnd, "");
}
break;
default:
return (CallWindowProc(hHatugenEditProc, hwnd, uMsg, wParam, lParam));
}
return 0L;
}
できました!本当にありがとうございました!
すぐ返信してもらえて本当に助かりました!