我尝试制作剪贴板记录器。这个想法是每隔5秒钟就会改变剪贴板上文本的程序检查;但问题是,在开始时剪贴板显示两次,之后没有显示任何内容。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <windows.h>
DWORD WINAPI check()
{
char *strData;
char *oldData = "";
for(;;){
OpenClipboard(NULL);
HANDLE hClipboardData = GetClipboardData(CF_TEXT);
char *pchData = (char*)GlobalLock(hClipboardData);
strData = pchData;
GlobalUnlock(hClipboardData);
CloseClipboard();
if(strData == oldData)
{
//do nothing
}
else
{
printf("%s\n", strData); //here its print twice and then nothing what is not the intention
oldData = strData;
}
Sleep(5000);
}
}
int main()
{
printf("Hello\n");
printf("Your clipboard:\n");
HANDLE thread = CreateThread(NULL, 0, check, NULL, 0, NULL);
getchar();
return 0;
}
有人可以帮助我吗?
答案 0 :(得分:2)
你有几个问题......
如果你想保留一个字符串,你需要将它保持为静态,否则变量会在你从该函数返回时丢失。
DWORD WINAPI check()
{
char *strData;
static char *oldData = NULL; // here you'd need static and use NULL by default
正如其他人所提到的,比较字符串是用strcmp()或类似方法完成的:
if(strcmp(strData, oldData) == 0)
但是,现在oldData可以为NULL,您必须验证它是否已分配:
if(oldData && strcmp(strData, oldData) == 0)
如果给出了一个新字符串,那么您想要释放旧字符串并替换为新字符串:
if(oldData) free(oldData);
oldData = strdup(strData);
现在应该可以了。