有时候我总苦于在两台计算机之间奔波,而中国的IP又是如此的金贵以至于你压根别想远程连接到你的PersonalComputer上。一两年前还可以用花生壳动态链到花生壳的客户端上,可是由于“有关部门”的一纸声明,域名不再是可以随便注册的了。中国互联网的冬天于是悄然来临。
不扯这么多了,我们完全可以通过QQ远程控制自己的计算机,不过其中最大的问题还是那徽标类似于Linux却连API都不公开的公司了。无奈只有发扬我朝科技工作者伟大的山寨精神,寻求一点解决方案了。
我的方案如下:
你需要再注册一个账号,然后稍作处理,比如去掉各种状态切换, 当然最重要的是,这样你在给受控账号发消息的时候就会直接弹出一个窗口了。然后在你的主账号把受控账号加为好友,接下来就到了发挥我们伟大的山寨精神的时候了。
你会发现每次弹出的窗口的位置是一样的,这样就方便了很多(当然如果不一样完全可以找到窗口的句柄再用客户区坐标操作,可以用Spy++模拟一下)。我们可以写一个程序,在后台一直启动一个守护进程,轮询地查找有没有QQ消息的弹出窗口,如果是从主账号发过来的,就模拟鼠标去点那些诸如“远程协助”“请求受控”之类的按钮,这样就华丽丽的完成了我们的工作,oh yeah.
接下来我们用主账户向受控账户发一条消息,用Spy++看弹出窗口的属性,结果如下:
可以看到窗口的名称是你的主账号名,窗口的类是TXGuiFoundation,我们可以通过
HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName );
来查找窗口句柄,以确定是不是有窗口弹出,然后用
BOOL SetCursorPos( int x, int y ); VOID mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, DWORD dwExtraInfo );
模拟鼠标单击事件,具体代码如下
————————————————————————————————我是代码的分割线——————————————————————————————
#include <windows.h> LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void Press(int x,int y);//点击一个按钮 #define QQName "布拉德比特" #define QQClass "TXGuiFoundation" #define Application 818,248 #define Assistance 832,291 #define Accept 918,608 #define DaemonTimer 1 //平时轮询的timer #define WaitTimer 2 //申请受控的timer #define WorkingTimer 3 //轮询受控是否完成的timer #define Elapse 1000 //轮询的时间间隔 #define WaitTimeOut 5000 //等待主控同意的时间间隔 #define SleepDelay 500 //点击应用->协助的时延间隔 #define WaitDelay 5000 //点击同意->申请受控的时间间隔 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Daemon"); HWND hwnd; MSG msg; WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW); wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = szAppName; wndclassex.hIconSm = wndclassex.hIcon; if (!RegisterClassEx (&wndclassex)) { MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, szAppName, TEXT ("WindowTitle"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); SetTimer(hwnd,DaemonTimer,Elapse,(TIMERPROC)WndProc); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND handle=0; switch (message) { case WM_CREATE: return (0); case WM_TIMER: switch (wParam) { case DaemonTimer: handle=::FindWindow(QQClass,QQName); if(handle)//找到 { Sleep(1000);//防止窗口弹得太慢.... Press(Application);//按应用 Sleep(SleepDelay); Press(Assistance);//按远程协助 KillTimer(hwnd,DaemonTimer);//停止轮询,等待点受控 SetTimer(hwnd,WaitTimer,WaitTimeOut,(TIMERPROC)WndProc);//等待主控机操作 } return (0); case WaitTimer: KillTimer(hwnd,WaitTimer);//停止等待 Press(Accept);//点接受 Sleep(WaitDelay); Press(Accept);//点同意受控 SetTimer(hwnd,WorkingTimer,DaemonTimer,(TIMERPROC)WndProc); return (0); case WorkingTimer: handle=::FindWindow(QQClass,QQName); if(!handle)//找不到了 { KillTimer(hwnd,WorkingTimer); SetTimer(hwnd,DaemonTimer,Elapse,(TIMERPROC)WndProc);//正常轮询 } return (0); } case WM_DESTROY: PostQuitMessage (0); return (0); } return DefWindowProc (hwnd, message, wParam, lParam); } void Press(int x,int y) { SetCursorPos(x,y);//模拟鼠标移动 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//模拟鼠标左键down mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//模拟鼠标左键up }
这三个分别是三个按钮(应用,远程协助,和同意/申请受控)的位置(屏幕坐标)
Application 818,248
Assistance 832,291
Accept 918,608
我们可以写个程序去获取屏幕坐标,核心代码也只有这么一点
void CGetCursorDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CString str; POINT point; GetCursorPos(&point); str.Format("x:%d y:%d",point.x,point.y); GetDlgItem(IDC_STATIC)->SetWindowText(str); CDialog::OnTimer(nIDEvent); }
当然不要忘了把窗口置为最前
::SetWindowPos(GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOSIZE | SWP_NOMOVE) );
程序文件也可以在http://g.zhubajie.com/urllink.php?id=9989557cd1u21u3n72xhh85下载
这样我们的受控机登陆着受控QQ的账号,守护进程在后台运行,如果弹出“布拉德比特”的消息窗口,程序就会去点击应用\远程协助,之后等待5秒钟让你在主控机器上点击"接受",之后程序会依次点击“申请受控”和“同意”,这样就完成了一个完整的远程协助申请过程。记得退出的时候一定要通过关闭QQ窗口来退出,以使守护进程复位。
OK,远程管理你的计算机吧~~