#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;
}
uj5u.com熱心網友回復:
聽說64位系統上鉤子分32/64位要分別鉤。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/67072.html
標籤:網絡編程
