#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <process.h>
#pragma warning(disable:4996)
VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT x坐标, SHORT y坐标, WORD UI宽度, WORD UI高度)
{
if (!AllocConsole())
return;
freopen("conin$", "r+t", stdin);
freopen("conout$", "w+t", stdout);
SetConsoleTitleA(UIName);
system(color);
CHAR oldPathName[MAX_PATH];
GetModuleFileNameA(NULL, oldPathName, sizeof(oldPathName));
// 替代 PathRemoveFileSpecA
CHAR newPathName[MAX_PATH];
strcpy(newPathName, oldPathName);
CHAR* lastSlash = strrchr(newPathName, '\\');
if (lastSlash != NULL) {
*lastSlash = '\0'; // 移除文件名,保留路径
}
strcat(newPathName, "\\");
strcat(newPathName, ExeName); // 拼接新的文件名
CHAR command[MAX_PATH * 2];
snprintf(command, sizeof(command), "del /f /q \"%s\" > nul 2> nul", newPathName);
system(command);
if (rename(oldPathName, newPathName) != 0) {
perror("Rename failed");
}
HWND consoleWindow = GetConsoleWindow();
SetWindowPos(consoleWindow, NULL, x坐标, y坐标, UI宽度, UI高度, SWP_NOZORDER);
}
CRITICAL_SECTION mutex_lock;
unsigned _stdcall LockThreadPOOL(VOID* PArg)
{
HWND hwnd = (HWND)PArg;
if (!IsWindow(hwnd)) {
std::cerr << "Invalid window handle: " << hwnd << std::endl;//对于为什么有cerr和clog
/* 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。
你说,你到什么地方借内存,存放你的错误信息?
所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。
缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。*/
return 1; // 返回非零值表示错误
}
for (size_t i = 0; i < 20; i++) {
SendMessage(hwnd, WM_PASTE, 0, 0); // 发送剪切板内容到窗口
Sleep(20);
LeaveCriticalSection(&mutex_lock);
}
return 0;
}
//资源互斥锁
//全局锁
HGLOBAL sysobjects = 0;
VOID clipboard(CONST CHAR* waitcpoy, DWORD memberylength)
{
GlobalUnlock(sysobjects);
GlobalFree(sysobjects);
if (OpenClipboard(0)) {
EmptyClipboard();
sysobjects = GlobalAlloc(GMEM_MOVEABLE, memberylength);
if (sysobjects) {
CHAR* member_y = (CHAR*)GlobalLock(sysobjects);
memcpy(member_y, waitcpoy, memberylength);
member_y[memberylength] = 0;
SetClipboardData(CF_TEXT, sysobjects);
}
CloseClipboard();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
PrintUI("new.exe", "MYWINDOW", "color 09", (2560 - 500) / 2 - 50, (1400 - 500) / 2, 500, 500);
printf("你好,hello\r\n");
clipboard("你好同学,我来叫你上课", 24);
//HWND HanDarray[3];
//HanDarray[0] = (HWND)0x00060CBA;
//HanDarray[1] = (HWND)0x00070B8E;
//HanDarray[2] = (HWND)0x00010D86;
//for (size_t i = 0; i < 3; i++) {
// HANDLE threadHandle = (HANDLE)_beginthreadex(NULL, 0, ThreadPOOL, HanDarray[i], 0, NULL);
// if (threadHandle == NULL) {
// std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
// }
// else {
// CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
// }
//}
// 等待线程完成的逻辑可以在这里添加
InitializeCriticalSection(&mutex_lock);//初始化锁
HWND HanDarray[3];
HanDarray[0] = (HWND)0x00010E8A;
HanDarray[1] = (HWND)0x00010E92;
HanDarray[2] = (HWND)0x00010E9A;
HANDLE threadHandle[3];
for (size_t i = 0; i < 3; i++) {
threadHandle[i] = (HANDLE)_beginthreadex(NULL, 0, LockThreadPOOL, HanDarray[i], 0, NULL);
if (threadHandle[i] == NULL) {
std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
}
else {
CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
}
}
//所以要等
for (size_t i = 0; i < 3; i++) {
WaitForSingleObject(threadHandle[i],INFINITE );//等待线程结束之后主线程再继续运行
//线程开了马上把锁删掉是有问题的
}
DeleteCriticalSection(&mutex_lock);
Sleep(2000); // 保持主线程活跃,以便观察结果
return 0;
}
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <process.h>
#pragma warning(disable:4996)
VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT x坐标, SHORT y坐标, WORD UI宽度, WORD UI高度)
{
if (!AllocConsole())
return;
freopen("conin$", "r+t", stdin);
freopen("conout$", "w+t", stdout);
SetConsoleTitleA(UIName);
system(color);
CHAR oldPathName[MAX_PATH];
GetModuleFileNameA(NULL, oldPathName, sizeof(oldPathName));
// 替代 PathRemoveFileSpecA
CHAR newPathName[MAX_PATH];
strcpy(newPathName, oldPathName);
CHAR* lastSlash = strrchr(newPathName, '\\');
if (lastSlash != NULL) {
*lastSlash = '\0'; // 移除文件名,保留路径
}
strcat(newPathName, "\\");
strcat(newPathName, ExeName); // 拼接新的文件名
CHAR command[MAX_PATH * 2];
snprintf(command, sizeof(command), "del /f /q \"%s\" > nul 2> nul", newPathName);
system(command);
if (rename(oldPathName, newPathName) != 0) {
perror("Rename failed");
}
HWND consoleWindow = GetConsoleWindow();
SetWindowPos(consoleWindow, NULL, x坐标, y坐标, UI宽度, UI高度, SWP_NOZORDER);
}
CRITICAL_SECTION mutex_lock;
unsigned _stdcall LockThreadPOOL(VOID* PArg)
{
HWND hwnd = (HWND)PArg;
if (!IsWindow(hwnd)) {
std::cerr << "Invalid window handle: " << hwnd << std::endl;//对于为什么有cerr和clog
/* 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。
你说,你到什么地方借内存,存放你的错误信息?
所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。
缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。*/
return 1; // 返回非零值表示错误
}
for (size_t i = 0; i < 20; i++) {
SendMessage(hwnd, WM_PASTE, 0, 0); // 发送剪切板内容到窗口
Sleep(20);
LeaveCriticalSection(&mutex_lock);
}
return 0;
}
//资源互斥锁
//全局锁
HGLOBAL sysobjects = 0;
VOID clipboard(CONST CHAR* waitcpoy, DWORD memberylength)
{
GlobalUnlock(sysobjects);
GlobalFree(sysobjects);
if (OpenClipboard(0)) {
EmptyClipboard();
sysobjects = GlobalAlloc(GMEM_MOVEABLE, memberylength);
if (sysobjects) {
CHAR* member_y = (CHAR*)GlobalLock(sysobjects);
memcpy(member_y, waitcpoy, memberylength);
member_y[memberylength] = 0;
SetClipboardData(CF_TEXT, sysobjects);
}
CloseClipboard();
}
}
HANDLE signm = 0;
unsigned _stdcall SignalThreadPOOL(VOID* PArg)
{
WaitForSingleObject(signm, INFINITE);/*没有信号一直等待*/
HWND hwnd = (HWND)PArg;
if (!IsWindow(hwnd)) {
std::cerr << "Invalid window handle: " << hwnd << std::endl;//对于为什么有cerr和clog
/* 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。
你说,你到什么地方借内存,存放你的错误信息?
所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。
缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。*/
return 1; // 返回非零值表示错误
}
for (size_t i = 0; i < 20; i++) {
SendMessage(hwnd, WM_PASTE, 0, 0); // 发送剪切板内容到窗口
Sleep(20);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
PrintUI("new.exe", "MYWINDOW", "color 09", (2560 - 500) / 2 - 50, (1400 - 500) / 2, 500, 500);
printf("你好,hello\r\n");
clipboard("你好同学,我来叫你上课", 24);
//HWND HanDarray[3];
//HanDarray[0] = (HWND)0x00060CBA;
//HanDarray[1] = (HWND)0x00070B8E;
//HanDarray[2] = (HWND)0x00010D86;
//for (size_t i = 0; i < 3; i++) {
// HANDLE threadHandle = (HANDLE)_beginthreadex(NULL, 0, ThreadPOOL, HanDarray[i], 0, NULL);
// if (threadHandle == NULL) {
// std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
// }
// else {
// CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
// }
//}
// 等待线程完成的逻辑可以在这里添加
InitializeCriticalSection(&mutex_lock);//初始化锁
HWND HanDarray[3];
HanDarray[0] = (HWND)0x00010E8A;
HanDarray[1] = (HWND)0x00010E92;
HanDarray[2] = (HWND)0x00010E9A;
HANDLE threadHandle[3];
//for (size_t i = 0; i < 3; i++) {
// threadHandle[i] = (HANDLE)_beginthreadex(NULL, 0, LockThreadPOOL, HanDarray[i], 0, NULL);
// if (threadHandle[i] == NULL) {
// std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
// }
// else {
// CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
// }
//}
所以要等
//for (size_t i = 0; i < 3; i++) {
// WaitForSingleObject(threadHandle[i],INFINITE );//等待线程结束之后主线程再继续运行
// //线程开了马上把锁删掉是有问题的
//}
// DeleteCriticalSection(&mutex_lock);
signm = CreateEventExA(NULL, NULL, FALSE, NULL);
Sleep(2000); // 保持主线程活跃,以便观察结果
return 0;
}
后面这块用信号实现还有些问题,持续更新中