// window.cpp : アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "window.h" #include "winuser.h" #include "stdio.h" #include "winsock2.h" #pragma comment(lib,"wsock32.lib") #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス TCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト TCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 HINSTANCE ghInstance; #define IDC_EDITBOX1 MAKEINTRESOURCE(110) #define IDC_EDITBOX2 MAKEINTRESOURCE(120) #define IDC_BUTTON MAKEINTRESOURCE(121) //热键 int hotkey[100]; //主窗口句柄 HWND hWnd; void makeDialog( HWND hWnd ); void appendEditbox( HWND hWnd ); void appendButton( HWND hWnd); int writeTOBoxUp( HWND hWnd); void writeTOBoxUp1( char* buff ) { HWND upBoxWnd = GetDlgItem( hWnd, 110 ); LRESULT textlength1 = SendMessage( upBoxWnd,WM_GETTEXTLENGTH,0,0); //光标定位到下一行 SendMessage(upBoxWnd, EM_SETSEL, textlength1*2, -1); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)(_T("他"))); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"/n"); //输出内容,方法同上 LRESULT textlength2 = SendMessage( upBoxWnd,WM_GETTEXTLENGTH,0,0); SendMessage(upBoxWnd, EM_SETSEL, textlength2*2, -1); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)buff); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"/n"); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"/n"); SendMessage(upBoxWnd, WM_VSCROLL, SB_BOTTOM, 0); } DWORD WINAPI ThreadProc(LPVOID pParam) { SOCKET sckListenId; struct sockaddr_in serverAddr; SOCKET sckComm; char szBuffer[1024]; int iRetval; int iLength; WORD wVersion; WSADATA wsaData; wVersion = MAKEWORD(1,1); iRetval = WSAStartup(wVersion,&wsaData); if(iRetval != 0) { perror("there is no dll to use!/n"); return(-1); } if( ( LOBYTE(wsaData.wVersion) != 1 ) || ( HIBYTE(wsaData.wVersion) != 1 ) ) { perror("there is not right dll!/n"); iRetval = WSACleanup(); if (iRetval == SOCKET_ERROR) { perror("ERROR: WSACleanup unsuccessful!/n"); } return(-2); } sckListenId = socket( AF_INET, SOCK_STREAM, 0); if( sckListenId == INVALID_SOCKET ) { perror("ERROR: socket unsuccessful!/n"); iRetval = WSACleanup(); if (iRetval == SOCKET_ERROR) { perror("ERROR: WSACleanup unsuccessful!/n"); } return(-3); } serverAddr.sin_port = htons(5151); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); iRetval = bind(sckListenId, (LPSOCKADDR)&serverAddr, sizeof(serverAddr)); if (iRetval == SOCKET_ERROR) { perror("ERROR: Bind unsuccessful!/n"); return(-4); } iLength = sizeof(serverAddr); if (getsockname(sckListenId,(struct sockaddr *)&serverAddr,&iLength) == SOCKET_ERROR) { perror("there is error in getting name!/n"); return(-5); } printf("Listen socket port %d /n",ntohs(serverAddr.sin_port)); iRetval = listen(sckListenId, 5); if (iRetval == SOCKET_ERROR) { perror("ERROR: Listen unsuccessful!/n"); return(-6); } do { sckComm = accept(sckListenId,(struct sockaddr *)&serverAddr,&iLength); if (sckComm == INVALID_SOCKET) { perror("ERROR: new comm socket unsuccessful!/n"); continue; } else { do { memset(szBuffer,0,sizeof(szBuffer)); iRetval = recv(sckComm,szBuffer,1024,0); if (iRetval < 0) { perror("there is error in receiving!/n"); break; } if (iRetval == 0) { break; } else { writeTOBoxUp1( szBuffer ); break; } }while(1); } closesocket(sckComm); }while(TRUE); closesocket(sckListenId); WSACleanup(); } int sendMess() { WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; int retVal; char buf[1024]; HWND downBoxWnd = GetDlgItem(hWnd,120); GetDlgItemText(hWnd,(int)IDC_EDITBOX2,(LPTSTR)buf,1024); SetDlgItemText(hWnd,(int)IDC_EDITBOX2,_T("")); SendMessage(downBoxWnd, EM_SETSEL, 0, -1); if( WSAStartup( MAKEWORD(2,2), &wsd ) != 0 ) { return -1;//失败 } sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET==sHost) { WSACleanup(); return -1;//创建套接字失败 } servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr("192.168.6.157"); servAddr.sin_port=htons((short)5151); int nServAddlen=sizeof(servAddr); retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr)); if(SOCKET_ERROR==retVal) { DWORD d = GetLastError(); closesocket(sHost); WSACleanup(); return -1;//连接服务器失败 } retVal=send(sHost,buf,sizeof(buf),0); if(SOCKET_ERROR==retVal) { closesocket(sHost); WSACleanup(); return -1;//向服务器发送数据失败 } closesocket(sHost); WSACleanup(); } // このコード モジュールに含まれる関数の宣言を転送します: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); ghInstance = hInstance; // TODO: ここにコードを挿入してください。 MSG msg; HACCEL hAccelTable; LoadLibrary(_T("riched32.dll")); // グローバル文字列を初期化しています。 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WINDOW, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // アプリケーションの初期化を実行します: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOW)); LPDWORD lpThreadId = 0; CreateThread( NULL, 0, ThreadProc, NULL, 0, lpThreadId ); // メイン メッセージ ループ: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // // コメント: // // この関数および使い方は、'RegisterClassEx' 関数が追加された // Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。 // アプリケーションが、関連付けられた // 正しい形式の小さいアイコンを取得できるようにするには、 // この関数を呼び出してください。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASS wc; //<contains the window class attributes that are registered by the RegisterClass wc.lpszClassName = szWindowClass; wc.lpfnWndProc = WndProc; wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; wc.hInstance = hInstance; wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_WINDOW) ); wc.hCursor = LoadCursor( hInstance, IDC_WAIT ); wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+11); wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; return RegisterClass( &wc ); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 hWnd = CreateWindow(szWindowClass, szTitle, WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX, 500, 200, 400, 500, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hotkey[0] = GlobalAddAtom((LPWSTR)"ctrl+enter"); RegisterHotKey( hWnd, hotkey[0], MOD_CONTROL, VK_RETURN ); return TRUE; } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_CREATE: makeDialog( hWnd ); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; case IDC_BUTTON: if ( HIWORD(wParam) == BN_CLICKED ) { if ( writeTOBoxUp(hWnd) == 1 ) { sendMess(); } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_HOTKEY: { if ( (int)wParam == hotkey[0] ) { if ( hWnd == GetForegroundWindow() ) { if ( writeTOBoxUp(hWnd) == 1 ) { sendMess(); } } } //添加热键处理 else { } } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 描画コードをここに追加してください... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } //从下面的格子取内容输出到上面的格子 int writeTOBoxUp( HWND hWnd ) { //下面格子内容太大或空皆不可 char edittext[1024]; HWND downBoxWnd = GetDlgItem(hWnd,120); LRESULT textlength = SendMessage( downBoxWnd,WM_GETTEXTLENGTH,0,0); GetDlgItemText(hWnd,(int)IDC_EDITBOX2,(LPTSTR)edittext,1024); if ( textlength >= 1024 ) { MessageBox( hWnd, _T(" oversize!"), _T(""), 0 ); return -1; } else if ( textlength == 0 ) { MessageBox( hWnd, _T(" Cannot be nothing!"), _T(""), 0 ); return -1; } LRESULT CBIndex; HWND upBoxWnd = GetDlgItem(hWnd,110); CBIndex = SendMessage(upBoxWnd,CB_GETCURSEL,0,0); //checks whether or not any value is selected in the combo box if not retuns -1 if (CBIndex != -1) { //输出使用者 //计算原内容长度 LRESULT textlength1 = SendMessage( upBoxWnd,WM_GETTEXTLENGTH,0,0); //光标定位到下一行 SendMessage(upBoxWnd, EM_SETSEL, textlength1*2, -1); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)(_T("私"))); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"/n"); //输出内容,方法同上 LRESULT textlength2 = SendMessage( upBoxWnd,WM_GETTEXTLENGTH,0,0); SendMessage(upBoxWnd, EM_SETSEL, textlength2*2, -1); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)edittext); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"/n"); SendMessage(upBoxWnd, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)"/n"); SendMessage(upBoxWnd, WM_VSCROLL, SB_BOTTOM, 0); } return 1; } void makeDialog( HWND hWnd ) { appendEditbox(hWnd); appendButton(hWnd); } void appendEditbox( HWND hWnd ) { CreateWindow( _T("RichEdit"), NULL, WS_CHILD|WS_VISIBLE |WS_BORDER|WS_GROUP|WS_TABSTOP|ES_MULTILINE|ES_READONLY|WS_HSCROLL|WS_VSCROLL, 0, 0, 400, 300, hWnd,(HMENU)IDC_EDITBOX1, ghInstance, NULL); HWND upBoxWnd = GetDlgItem(hWnd,(int)IDC_EDITBOX1); SendMessage(upBoxWnd,WM_VSCROLL,SB_BOTTOM,0); CreateWindow( _T("RichEdit"), NULL, WS_CHILD|WS_VISIBLE |WS_BORDER|WS_GROUP|WS_TABSTOP|ES_MULTILINE|WS_HSCROLL|WS_VSCROLL, 0, 310, 400, 120, hWnd, (HMENU)IDC_EDITBOX2, ghInstance, NULL); HWND downBoxWnd = GetDlgItem(hWnd,(int)IDC_EDITBOX2); SendMessage(downBoxWnd,WM_VSCROLL,SB_BOTTOM,0); } void appendButton( HWND hWnd) { CreateWindow( _T("Button"), _T("OK"), WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP, 310, 435, 80, 30, hWnd, (HMENU)IDC_BUTTON, ghInstance, NULL); } // バージョン情報ボックスのメッセージ ハンドラです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }