远程控制(3)
本來想把這些都寫在(2)里面的,想想還是寫到(3)吧,這樣比較容易看點
完成圖片傳送和顯示,那么就開始控制,有了前面的基礎(chǔ),對于網(wǎng)絡(luò)傳輸都有一定的了解了,那么我們再傳其他東西也差不多道理.還不懂就得找本書看了..老實說,看書才是硬道理.
先看下面兩個數(shù)據(jù)結(jié)構(gòu):
struct?MouseEvent
{
????private?Byte[]?type;
????private?Byte[]?x;
????private?Byte[]?y;
????public?MouseEvent(MouseEventType?Type,int?X,int?Y)
????{
????????this.type?=?BitConverter.GetBytes((int)Type);
????????this.x?=?BitConverter.GetBytes(X);
????????this.y?=?BitConverter.GetBytes(Y);
????}
????public?MouseEvent(Byte[]?Type,?Byte[]?X,?Byte[]?Y)
????{
????????this.type?=?Type;
????????this.x?=?X;
????????this.y?=?Y;
????}
????public?MouseEvent(Byte[]?Content)
????{
????????type?=?new?byte[4];
????????x?=?new?byte[4];
????????y?=?new?byte[4];
????????for?(int?i?=?0;?i?<?Content.Length;?i++)
????????{
????????????if?(i?>=?0?&&?i?<?4)
????????????????type[i]?=?Content[i];
????????????if?(i?>=?4?&&?i?<?8)
????????????????x[i-4]?=?Content[i];
????????????if?(i?>=?8?&&?i?<?12)
????????????????y[i-8]?=?Content[i];
????????}
????}
????public?MouseEventType?Type
????{
????????get?{?return?(MouseEventType)BitConverter.ToInt32(type,?0);?}
????}
????public?int?X
????{
????????get?{?return?BitConverter.ToInt32(x,?0);?}
????}
????public?int?Y
????{
????????get?{?return?BitConverter.ToInt32(y,?0);?}
????}
????public?Byte[]?ToBytes()
????{
????????Byte[]?Bytes?=?new?Byte[12];
????????type.CopyTo(Bytes,?0);
????????x.CopyTo(Bytes,?4);
????????y.CopyTo(Bytes,?8);
????????return?Bytes;
????}
}
enum?MouseEventType?:?int
{
????MouseMove=0,
????MouseLeftDown,
????MouseLeftUp,
????MouseRightDown,
????MouseRightUp,
????MouseClick,
????MouseDoubleClick
}
一個是鼠標事件的結(jié)構(gòu)體,一個鼠標事件類型枚舉
我們這次發(fā)送和接收的包,當然,還可以有鍵盤事件的包,我偷懶,沒做網(wǎng)絡(luò)傳輸就不說了,和(1)(2)差不多,上面的結(jié)構(gòu)體也定義得可以用了.
說說流程吧
鼠標的事件都是在panel上的事件,move,click,doubleclick,左鍵右鍵就自己判斷了,由于panel大小是和受控方屏幕大小一樣,所以獲得坐標就等同于受控方屏幕的坐標,這樣,一個MouseEvent的包就可以組成了,發(fā)送.
受控放接收,直接構(gòu)造函數(shù)構(gòu)造一個新的MouseEvent(Byte[] Content).就可以通過結(jié)構(gòu)體的屬性獲得相應(yīng)的內(nèi)容,說明一下,圖片和事件的偵聽和發(fā)送端口不能一樣.這樣就可以進行控制了.
怎么控制呢?這里就要調(diào)用win32 API了,還有用到委托,因為委托是線程安全的.
首先看一下聲明吧,我們要用到的API
????????[DllImport("user32")]
????????public?static?extern?void?mouse_event(MouseEventFlag?flags,?int?dx,?int?dy,?int?dwData,?int?dwExtraInfo);
????????[DllImport("user32")]
????????public?static?extern?bool?SetCursorPos(int?X,?int?Y);
???然后鼠標事件類型的枚舉:
public?enum?MouseEventFlag
{
????Move?=?0x0001,
????LeftDown?=?0x0002,
????LeftUp?=?0x0004,
????RightDown?=?0x0008,
????RightUp?=?0x0010,
????MiddleDown?=?0x0020,
????MiddleUp?=?0x0040,
????XDown?=?0x0080,
????XUp?=?0x0100,
????Wheel?=?0x0800,
????VirtualDesk?=?0x4000,
????Absolute?=?0x8000
}
聲明委托與事件
????????public?delegate?void?DoMouseButtons(MouseEventFlag?flags,?int?dx,?int?dy,?int?dwData,?int?dwExtraInfo);
????????public?delegate?bool?DoMouseMove(int?X,?int?Y);
????????private?event?DoMouseMove?MouseMove;
????????private?event?DoMouseButtons?MouseButton;
添加事件
????????????MouseButton?+=?new?DoMouseButtons(mouse_event);
????????????MouseMove?+=?new?DoMouseMove(SetCursorPos);
到這里,我們就可以模擬鼠標的事件了 switch?(MEvent.Type)
{
????case?MouseEventType.MouseMove:
????????MouseMove(MEvent.X,?MEvent.Y);
????????break;
????case?MouseEventType.MouseLeftDown:
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseLeftUp:
????????MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseRightDown:
????????MouseButton(MouseEventFlag.RightDown,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseRightUp:
????????MouseButton(MouseEventFlag.RightUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseClick:
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
????????MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseDoubleClick:
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
??????????? MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
}
完成圖片傳送和顯示,那么就開始控制,有了前面的基礎(chǔ),對于網(wǎng)絡(luò)傳輸都有一定的了解了,那么我們再傳其他東西也差不多道理.還不懂就得找本書看了..老實說,看書才是硬道理.
先看下面兩個數(shù)據(jù)結(jié)構(gòu):
struct?MouseEvent
{
????private?Byte[]?type;
????private?Byte[]?x;
????private?Byte[]?y;
????public?MouseEvent(MouseEventType?Type,int?X,int?Y)
????{
????????this.type?=?BitConverter.GetBytes((int)Type);
????????this.x?=?BitConverter.GetBytes(X);
????????this.y?=?BitConverter.GetBytes(Y);
????}
????public?MouseEvent(Byte[]?Type,?Byte[]?X,?Byte[]?Y)
????{
????????this.type?=?Type;
????????this.x?=?X;
????????this.y?=?Y;
????}
????public?MouseEvent(Byte[]?Content)
????{
????????type?=?new?byte[4];
????????x?=?new?byte[4];
????????y?=?new?byte[4];
????????for?(int?i?=?0;?i?<?Content.Length;?i++)
????????{
????????????if?(i?>=?0?&&?i?<?4)
????????????????type[i]?=?Content[i];
????????????if?(i?>=?4?&&?i?<?8)
????????????????x[i-4]?=?Content[i];
????????????if?(i?>=?8?&&?i?<?12)
????????????????y[i-8]?=?Content[i];
????????}
????}
????public?MouseEventType?Type
????{
????????get?{?return?(MouseEventType)BitConverter.ToInt32(type,?0);?}
????}
????public?int?X
????{
????????get?{?return?BitConverter.ToInt32(x,?0);?}
????}
????public?int?Y
????{
????????get?{?return?BitConverter.ToInt32(y,?0);?}
????}
????public?Byte[]?ToBytes()
????{
????????Byte[]?Bytes?=?new?Byte[12];
????????type.CopyTo(Bytes,?0);
????????x.CopyTo(Bytes,?4);
????????y.CopyTo(Bytes,?8);
????????return?Bytes;
????}
}
enum?MouseEventType?:?int
{
????MouseMove=0,
????MouseLeftDown,
????MouseLeftUp,
????MouseRightDown,
????MouseRightUp,
????MouseClick,
????MouseDoubleClick
}
一個是鼠標事件的結(jié)構(gòu)體,一個鼠標事件類型枚舉
我們這次發(fā)送和接收的包,當然,還可以有鍵盤事件的包,我偷懶,沒做網(wǎng)絡(luò)傳輸就不說了,和(1)(2)差不多,上面的結(jié)構(gòu)體也定義得可以用了.
說說流程吧
鼠標的事件都是在panel上的事件,move,click,doubleclick,左鍵右鍵就自己判斷了,由于panel大小是和受控方屏幕大小一樣,所以獲得坐標就等同于受控方屏幕的坐標,這樣,一個MouseEvent的包就可以組成了,發(fā)送.
受控放接收,直接構(gòu)造函數(shù)構(gòu)造一個新的MouseEvent(Byte[] Content).就可以通過結(jié)構(gòu)體的屬性獲得相應(yīng)的內(nèi)容,說明一下,圖片和事件的偵聽和發(fā)送端口不能一樣.這樣就可以進行控制了.
怎么控制呢?這里就要調(diào)用win32 API了,還有用到委托,因為委托是線程安全的.
首先看一下聲明吧,我們要用到的API
????????[DllImport("user32")]
????????public?static?extern?void?mouse_event(MouseEventFlag?flags,?int?dx,?int?dy,?int?dwData,?int?dwExtraInfo);
????????[DllImport("user32")]
????????public?static?extern?bool?SetCursorPos(int?X,?int?Y);
???然后鼠標事件類型的枚舉:
public?enum?MouseEventFlag
{
????Move?=?0x0001,
????LeftDown?=?0x0002,
????LeftUp?=?0x0004,
????RightDown?=?0x0008,
????RightUp?=?0x0010,
????MiddleDown?=?0x0020,
????MiddleUp?=?0x0040,
????XDown?=?0x0080,
????XUp?=?0x0100,
????Wheel?=?0x0800,
????VirtualDesk?=?0x4000,
????Absolute?=?0x8000
}
聲明委托與事件
????????public?delegate?void?DoMouseButtons(MouseEventFlag?flags,?int?dx,?int?dy,?int?dwData,?int?dwExtraInfo);
????????public?delegate?bool?DoMouseMove(int?X,?int?Y);
????????private?event?DoMouseMove?MouseMove;
????????private?event?DoMouseButtons?MouseButton;
添加事件
????????????MouseButton?+=?new?DoMouseButtons(mouse_event);
????????????MouseMove?+=?new?DoMouseMove(SetCursorPos);
到這里,我們就可以模擬鼠標的事件了 switch?(MEvent.Type)
{
????case?MouseEventType.MouseMove:
????????MouseMove(MEvent.X,?MEvent.Y);
????????break;
????case?MouseEventType.MouseLeftDown:
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseLeftUp:
????????MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseRightDown:
????????MouseButton(MouseEventFlag.RightDown,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseRightUp:
????????MouseButton(MouseEventFlag.RightUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseClick:
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
????????MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
????case?MouseEventType.MouseDoubleClick:
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
????????MouseButton(MouseEventFlag.LeftDown,?MEvent.X,?MEvent.Y,?0,?0);
??????????? MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????MouseButton(MouseEventFlag.LeftUp,?MEvent.X,?MEvent.Y,?0,?0);
????????break;
}
鼠標雙擊的這個事件有點問題,有時候不行...
恩,完了,就這樣,一個簡單的遠程控制就完成了,這個東西是我個人娛樂所作,雖然沒有什么技術(shù)含量,但是通過這樣,也可以學到很多東西,同時很多東西也加深了理解...
源碼下載地址
今天是元旦佳節(jié)哦~
?祝大家豬年快樂!? 年年進步!
友情提示:
如需轉(zhuǎn)載本文,請遵守"本站協(xié)議"并加入下面聲明 且注明原文鏈接。
作者:kevin wu
來源:kevin wu's corner
轉(zhuǎn)載于:https://www.cnblogs.com/kevin-wu/archive/2007/01/01/609430.html
總結(jié)
- 上一篇: Delphi实例分析:远程传输数据和文件
- 下一篇: js弹出DIV层