仅适用于同一台电脑的两个进程聊天,对于不同电脑之前的聊天需要依靠tcp/ip协议。

两个进程是通过发送WM_COPYDATA 消息来传输字节的。

代码如下:

Server.cpp

#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <thread> using namespace std; DWORD dwWritten;
DWORD num;
DWORD dwRead;
char strMessage[256];
HWND h_client;
void td1();
COORD coord;
SHORT i = 0;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
if (message == WM_DESTROY) { PostQuitMessage(0);
}
if (message == WM_COPYDATA)
{
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
if (pcds->dwData == 1)
{
CHAR* lpszString = (CHAR*)(pcds->lpData);
WriteConsoleOutputCharacterA(hStdOut, lpszString, strlen(lpszString)-2, { 0,i++ }, &dwWritten);
}
if (i > 24)
{
system("cls");
i = 0;
coord.X = 0;
coord.Y = 25;
SetConsoleCursorPosition(hStdOut, coord);
printf("----------------------------------------------------------------------------------------------------------\n");
}
}
return DefWindowProc(hwnd, message, wParam, lParam);
}; HINSTANCE hinst; int main() {
HWND hwnd; hinst = GetModuleHandle(NULL);
// create a window class:
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hinst;
wc.lpszClassName = L"win32"; // register class with operating system:
RegisterClass(&wc); // create and show window:
hwnd = CreateWindow(L"win32", L"Server", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
std::thread t1(td1);
if (hwnd == NULL) {
return 0;
} ShowWindow(hwnd, SW_SHOW); MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} } void td1()
{
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
while (1)
{
h_client = FindWindow(L"win32", L"Client");
if (h_client)
{
break;
}
}
coord.X = 0;
coord.Y = 25;
SetConsoleCursorPosition(hStdOut, coord);
printf("----------------------------------------------------------------------------------------------------------");
while (1)
{
coord.X = 0;
coord.Y = 26;
SetConsoleCursorPosition(hStdOut, coord);
memset(strMessage, 0, 256);
ReadFile(hStdIn, strMessage, 256, &dwRead, NULL);
SetConsoleCursorPosition(hStdOut, coord);
for (int i = strlen(strMessage); i > 0; i--)
{
putchar(32);
}
COPYDATASTRUCT cds;
cds.dwData = 1; // can be anything
cds.cbData = sizeof(CHAR) * strlen(strMessage);
cds.lpData = strMessage;
SendMessage(h_client, WM_COPYDATA, (WPARAM)h_client, (LPARAM)(LPVOID)&cds);
}
}

Client.cpp

#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <thread> using namespace std; DWORD dwWritten;
DWORD dwRead;
char strMessage[256];
HWND h_server;
SHORT i = 0;
COORD coord;
void td1(); LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
if (message == WM_DESTROY) { PostQuitMessage(0);
}
if (message == WM_COPYDATA)
{
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
if (pcds->dwData == 1)
{
CHAR* lpszString = (CHAR*)(pcds->lpData);
int len = pcds->cbData;
WriteConsoleOutputCharacterA(hStdOut, lpszString, len - 2, { 0,i++ }, &dwWritten);
}
if (i > 24)
{
system("cls");
i = 0;
coord.X = 0;
coord.Y = 25;
SetConsoleCursorPosition(hStdOut, coord);
printf("----------------------------------------------------------------------------------------------------------\n");
}
}
return DefWindowProc(hwnd, message, wParam, lParam);
} HINSTANCE hinst; int main() {
HWND hwnd; hinst = GetModuleHandle(NULL);
// create a window class:
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.hInstance = hinst;
wc.lpszClassName = L"win32"; // register class with operating system:
RegisterClass(&wc); // create and show window:
hwnd = CreateWindow(L"win32", L"Client", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
std::thread t1(td1); if (hwnd == NULL) {
return 0;
} ShowWindow(hwnd, SW_SHOW); MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} } void td1()
{
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
while (1)
{
h_server = FindWindow(L"win32", L"Server");
if (h_server)
{
break;
}
}
coord.X = 0;
coord.Y = 25;
SetConsoleCursorPosition(hStdOut, coord);
printf("----------------------------------------------------------------------------------------------------------");
while (1)
{
coord.X = 0;
coord.Y = 26;
SetConsoleCursorPosition(hStdOut, coord);
memset(strMessage, 0, 256);
ReadFile(hStdIn, strMessage, 256, &dwRead, NULL);
SetConsoleCursorPosition(hStdOut, coord);
for (int i = strlen(strMessage); i > 0; i--)
{
putchar(32);
}
COPYDATASTRUCT cds;
cds.dwData = 1; // can be anything
cds.cbData = sizeof(CHAR) * (strlen(strMessage) + 1);
cds.lpData = strMessage;
SendMessage(h_server, WM_COPYDATA, (WPARAM)h_server, (LPARAM)(LPVOID)&cds);
}
}

实现效果:

win32 - 控制台聊天的更多相关文章

  1. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  2. vc2010 win32 控制台应用程序中文乱码

    vc2010 win32 控制台应用程序中文乱码 在 vc2010 上用 win32 控制台程序写些测试代码调用 windows api ,处理错误信息时,发现用 wprintf 输出的错误信息出现了 ...

  3. win32控制台实现按任意键退出的功能

    win7之后的五win32 控制台出现了程序运行完之后就立即结束的问题,程序员根本无法看输出的结果.未来让控制台运行完之后能够等待程序员的操作.可以使用: system("PAUSE&quo ...

  4. java多线程控制台聊天室(转)

    用java多线程实现一个控制台聊天室,呵呵,好玩! 聊天室服务器端 package tf.thread; import java.io.BufferedReader; import java.io.I ...

  5. 基于UDP协议的控制台聊天程序(c++版)

    本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...

  6. C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出

    C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数 注意:在VS中调试执行时,在处理程序例程中设置断 ...

  7. Linux终端和win32控制台文本颜色输出

    在使用putty.secureCRT.XShell等终端仿真器连接linux系统时,ls.vim等工具的输出都含有各种颜色,这些颜色的输出大大地增强了文本的可读性. 通常我们可以使用echo命令加-e ...

  8. Visual Studio C++ Win32控制台应用程序,Win32项目,MFC的区别

    背景 Visual Studio C++ 创建新项目蹦出来如下选项: Win32控制台应用程序,Win32项目,MFC有什么区别? 正文: Win32控制台,没有界面,命令行执行生成的文件则直接在后台 ...

  9. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  10. Win32控制台程序和Win32应用程序

    刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...

随机推荐

  1. [转帖]umount -fl用法

    https://www.cnblogs.com/xingmuxin/p/8446178.html umount, 老是提示:device is busy, 服务又不能停止的.可以用"umou ...

  2. [转帖]minio性能测试

    https://zhangzhuo.ltd/articles/2021/09/08/1631106274550.html 压测参数说明 压测数据量为:2个backet,每个backet为10000对象 ...

  3. [转帖]clickHouse单机模式安装部署(RPM安装)

    关于版本和系统的选择 操作系统:Centos-7 ClickHouse: rpm 在安装,20.x 安装前的准备 CentOS7 打开文件数限 在 /etc/security/limits.conf ...

  4. [转帖]Linux Shell:date日期时间操作

    https://www.jianshu.com/p/cc9ebb212a8e 整理Linux Shell脚本中常用的日期操作,给予date命令,主要用法总结 获得当前日期,时间戳,date,date ...

  5. [转帖]Linux下使用 ipset 封大量IP及ipset参数说明

    https://www.cnblogs.com/xiaofeng666/p/10952627.html Linux使用iptables封IP,是常用的应对网络攻击的方法,但要封禁成千上万个IP,如果添 ...

  6. overcommit_memory的简单学习

    overcommit_memory的简单学习 背景 前几天一个测试环境启动失败. 总是有如下的提示: Native memory allocation (mmap) failed to map 122 ...

  7. [转帖]History of Web Browser Engines from 1990 until today

    https://eylenburg.github.io/browser_engines.htm Many tried, few remain... Last updated: January 2023 ...

  8. [转帖]Native Memory Tracking 详解(2):追踪区域分析(一)

    https://www.modb.pro/db/529363 上篇文章 Native Memory Tracking 详解(1):基础介绍 中,分享了如何使用NMT,以及NMT内存 & OS内 ...

  9. 在WPF应用中,结合阿里矢量图标库使用Geometry图标

    在我们的SqlSugar开发框架的WPF应端中,有时候我们需要在按钮或者其他界面元素上使用一些图标,框架中我们可以使用 lepoco/wpfui 项目的图标库,也可以使用Font-Awesome-WP ...

  10. vue3.2中setup语法糖父组件如何调用子组件中的方法

    父组件如何调用子组件中的方法 父组件.vue <template> <div> <aa ref="testRef"></aa> &l ...