switch(message) /*用开关语句判断消息并进行相应处理*/
{
case WM_CREATE: //窗口建立消息
GameEngine::GetGameEngine()->SetWindow(hWnd); //设置窗口句柄
GameStart(hWnd);
hEditName=CreateWindowEx(NULL,"edit","Mayi",WS_CHILD|WS_VISIBLE|WS_BORDER,100,30,120,25,hWnd,HMENU(EditID1),NULL,NULL);
hEditPass=CreateWindowEx(NULL,"edit",  "123",WS_CHILD|WS_VISIBLE|WS_BORDER,100,60,120,25,hWnd,HMENU(EditID2),NULL,NULL);
hButtonOk=CreateWindowEx(NULL,"button","登录",WS_CHILD|WS_VISIBLE|WS_BORDER,100,90,60,25,hWnd,HMENU(ButtonID1),(HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),NULL);
hButtonCancel=CreateWindowEx(NULL,"button","Cancel",WS_CHILD|WS_VISIBLE|WS_BORDER,180,90,60,25,hWnd,HMENU(ButtonID2),(HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
break;
  case WM_COMMAND:
    if ((lParam!=0)&&((wParam&0xffff)==ButtonID1))//登录按钮
    {
GetDlgItemText(hWnd,EditID1,wStrName,1024);//把editId1的什给wstrname
GetDlgItemText(hWnd,EditID2,wStrPass,1024);//把editId1的什给wstrpass
       
    }
case WM_SOCKET:
        if (WSAGETSELECTERROR(lParam))
        {
            closesocket( (SOCKET) wParam);
            break;
        }
switch(WSAGETSELECTEVENT(lParam))
        {
            case FD_CONNECT :
break;            case FD_READ:
g_pMayiClient->recvMayi(wParam);//接收信息
break;
            case FD_WRITE:
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
            break;
case FD_CLOSE:
closesocket( (SOCKET)wParam);
                break;
}
break;
case WM_DESTROY: //程序销毁消息
GameEnd(); //游戏结束,释放资源
PostQuitMessage(0); //通知WINDOWS,程序已发出终止请求
break; default:
//没有其他消息时,Windows将调用此缺省函数进行处理
return DefWindowProc(hWnd,message,wParam,lParam);
}
这是客户端,我点击登录按钮,把可以提供给用户输入的hEditName,hEditPass编辑框的内容发送给服务端,这可不知道怎么做?如果我把FD_WRITE的发送放到登录按钮上 case WM_COMMAND:
    if ((lParam!=0)&&((wParam&0xffff)==ButtonID1))//登录按钮
    {
GetDlgItemText(hWnd,EditID1,wStrName,1024);//把editId1的什给wstrname
GetDlgItemText(hWnd,EditID2,wStrPass,1024);//把editId1的什给wstrpass
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
}        
    }经调试,服务器端接收不到数据,要实现这个不知道怎么做呀,我在登录按钮创建发送数据线程不知道有用吗?
有什么办法吗,把我想要的实现?
最后:谢谢在网络另一端的你,认真看完这个题目。

解决方案 »

  1.   

      case WM_COMMAND:
        if ((lParam!=0)&&((wParam&0xffff)==ButtonID1))
        {

          GetDlgItemText(hWnd,EditID1,wStrName,1024);
      GetDlgItemText(hWnd,EditID2,wStrPass,1024);
      //memcpy(mc.p.name ,wStrName,strlen(wStrName));
      b=TRUE;      if (StrCmp(wStrName,"Mayi"))
          {
            MessageBox(NULL,"密码错误!",NULL,MB_OK);
          }
          else
          {
            MessageBox(NULL,"密码正确","恭喜",MB_OK);
          }
    SOCKET MayiClient;
    WSADATA wsd;  
        SOCKADDR_IN MClientAddr;
    HWND Window;
    WSAStartup(MAKEWORD(2,2), &wsd);
    MayiClient = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
        MClientAddr.sin_family = AF_INET;
        MClientAddr.sin_addr.s_addr = inet_addr("192.168.18.8");
    //MClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        MClientAddr.sin_port = htons(5150);
    //if(b==TRUE)
    connect(MayiClient,(SOCKADDR *)&MClientAddr,sizeof(MClientAddr)); 
        WSAAsyncSelect(MayiClient, hWnd, WM_SOCKET, FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
      SendMessage(hWnd,WM_SOCKET,(LPARAM)wStrName|(LPARAM)wStrPass,(LPARAM)FD_WRITE);
    //
            }
    break;这是我修改过来的,现在是可以接收信息,但不能传把strName,和strPass参数DWORD WINAPI MayiClient::sendMayi(WPARAM wParam,CHAR wStrName[1024],CHAR wStrPass[1024]) 
    { int nErrCode;
    packethdr packetHdr;// packetHdr;
    memset(&packetHdr, 0, sizeof(packetHdr));
    packetHdr.type='A';
    //memcpy(packetHdr.name,wStrName,sizeof(wStrName)); 
    //memcpy(packetHdr.password,wStrPass,sizeof(wStrPass));
    memcpy(packetHdr.name,"Mayi",sizeof("Mayi")); 
    memcpy(packetHdr.password,"123",sizeof("123"));
    nErrCode = send(wParam,(char*)&packetHdr,sizeof(packetHdr), 0);
    if (SOCKET_ERROR == nErrCode)
    {
    return 0;
    }
    }可以正常接收,但如果我用改成下面的,
    memcpy(packetHdr.name,wStrName,sizeof(wStrName)); 
    memcpy(packetHdr.password,wStrPass,sizeof(wStrPass));
    //memcpy(packetHdr.name,"Mayi",sizeof("Mayi")); 
    //memcpy(packetHdr.password,"123",sizeof("123"));对方收不到数据,经调试,strName 和strPass还是为空值,意思是说不能传递数据。
    不知怎么做才好?
      

  2.   

    不会是strName 和strPass内容为空吧;你之前没有在这俩参数里面存放数据吗;
      

  3.   

            hEditName=CreateWindowEx(NULL,"edit","Mayi",WS_CHILD|WS_VISIBLE|WS_BORDER,100,30,120,25,hWnd,HMENU(EditID1),NULL,NULL);
    hEditPass=CreateWindowEx(NULL,"edit",  "123",WS_CHILD|WS_VISIBLE|WS_BORDER,100,60,120,25,hWnd,HMENU(EditID2),
          GetDlgItemText(hWnd,EditID1,wStrName,1024);
          GetDlgItemText(hWnd,EditID2,wStrPass,1024);
    这是我存放的数据如果在这里最后面发送信息 case WM_COMMAND:...
    g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
    //经调试wStrName wStrPass 有内容,内容不为空,但放到这里,服务器还是接收不到数据
        break;            case FD_WRITE:
     g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
    //这里不管是不是在case WM_COMMAND有没有发送数据,经调试wStrName wStrPass内容为空。
    所以MayiClient::sendMayi执行这里 wStrName wStrPass 调试发现内容为空
       memcpy(packetHdr.name,wStrName,sizeof(wStrName)); 
        memcpy(packetHdr.password,wStrPass,sizeof(wStrPass))所以最后没有把我想要发送的内容发送出去。
      

  4.   

    问题已解决 CHAR wStrName[1024]="0";
    CHAR wStrPass[1024]="0";我刚开发始定义在WndProc内部,所以每次调用的时候不能达到目的正确的应该是定义在头文件那里 CHAR wStrName[1024]="0";
    CHAR wStrPass[1024]="0";
    不过还是要特别谢谢mengde007,耐心的看完题目,以及耐心的解答。