マウス位置サーバ
なんだか変な名前ですが、socketのサーバープログラムを作成してみました。
サーバーに接続するとサーバーのマウスカーソルの位置を返すプログラムです。
pythonでプロトタイプを作ってみました。
mouseserver.py
import socket import random import win32api sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('', 6633)) sock.listen(5) while 1: conn, addr = sock.accept() conn.send(str(win32api.GetCursorPos())) conn.close() sock.close()
すごくシンプルです。
起動しておいて
telnet localhost 6633
と接続してみるとマウスカーソルの位置が次のように返ってきます。
(123, 456)
もちろんリモートからもOKです。
さて実際のところは会社のクライアントに入れて、席にいるかどうかを見るために
考えたこのプログラム。
クライアントにはpythonは入っていないわけで、
Cで作ってみることにしました。
そのソースがこちら。
msrv.c
#include <stdio.h> #include <windows.h> #include <winsock.h> #define PORT 6634 int mserver(); int main(int argc ,char *argv[]){ STARTUPINFO si; PROCESS_INFORMATION pi; if (argc > 1) { mserver(); return 0; } GetStartupInfo(&si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; CreateProcess(NULL, "msrv.exe run", NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); return 0; } int mserver(){ int fromlen; char mpos[20]; WSADATA wsaData; SOCKADDR_IN saddin, faddin; SOCKET sock, nsock; POINT pos; if(WSAStartup(MAKEWORD(1,1), &wsaData)){ printf("WSAStartup error\n"); return 0; } sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(!sock){ printf("socket error\n"); return 0; } memset(&saddin, 0x00, sizeof(saddin)); saddin.sin_family = AF_INET; saddin.sin_port = htons(PORT); if ( bind(sock, (struct sockaddr *)&saddin, sizeof(saddin)) ){ printf("bind error\n"); return 0; } if ( listen(sock, 5) ){ printf("listen error\n"); return 0; } while(1){ fromlen = sizeof(faddin); nsock=accept(sock, (LPSOCKADDR)&faddin, &fromlen); if (nsock == INVALID_SOCKET){ printf("accept error\n"); return 0; } GetCursorPos(&pos); memset(mpos, 0x00, sizeof(mpos)); sprintf(mpos, "(%d, %d)", pos.x, pos.y); send(nsock, mpos, sizeof(mpos), 0); shutdown(nsock, 2); } WSACleanup(); }
すごく面倒でした・・・
コンパイルは
MinGWでやりました。
gcc -DWIN2 msrv.c -lwsock2 -o msrv.exe
このプログラムですが、一度起動してからCreateProcessで再度起動しています。
こうするとコンソールウインドウが出っぱなしにならなかったので。
あとはtelnetで接続するたびに現在のカーソル位置が返ってきます。
動いていれば、その席には人がいるってことです。
mouseclient.py
import socket import time HOST = 'localhost' PORT = 6634 for i in range(1, 50): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) data = s.recv(20) print 'Received', repr(data).replace('\\x00', '') time.sleep(1) s.close()
1秒毎に50回接続するスクリプトです。
こちらでマウスカーソルを再現させるなんてことも出来そうです。