/// <summary>
        /// スクリーンショットを撮影します。
        /// </summary>
        private async Task <Bitmap> TakeScreenShot()
        {
            var kancolleFrame = GetKanColleFrame();

            if (kancolleFrame == null)
            {
                AddLog(3, string.Format("艦これが読み込まれていないため、スクリーンショットを撮ることはできません。"));
                System.Media.SystemSounds.Beep.Play();
                return(null);
            }


            Task <ScreenShotPacket> InternalTakeScreenShot()
            {
                var request = new ScreenShotPacket();

                if (Browser == null || !Browser.IsBrowserInitialized)
                {
                    return(request.TaskSource.Task);
                }


                string script = $@"
(async function() 
{{
	await CefSharp.BindObjectAsync('{request.ID}');

	let canvas = document.querySelector('canvas');
	requestAnimationFrame(() =>
	{{
		let dataurl = canvas.toDataURL('image/png');
		{request.ID}.complete(dataurl);
	}});
}})();
";

                Browser.JavascriptObjectRepository.Register(request.ID, request, true);
                kancolleFrame.ExecuteJavaScriptAsync(script);

                return(request.TaskSource.Task);
            }

            var result = await InternalTakeScreenShot();

            // ごみ掃除
            Browser.JavascriptObjectRepository.UnRegister(result.ID);
            kancolleFrame.ExecuteJavaScriptAsync($@"delete {result.ID}");

            return(result.GetImage());
        }
示例#2
0
        public void ReceiveData()
        {
            Packet packet = (Packet)Packet.Deserialize(this.readBuffer);

            //패킷 타입에 따라 처리할 코드를 달리한다.
            //추후에 아이템 같은 타입에 대한 처리도 추가할 예정.
            switch ((int)packet.Type)
            {
            case (int)PacketType.스샷:
            {
                if (Enemy_Screen.Image != null)
                {
                    Invoke(new MethodInvoker(delegate()
                        {
                            Enemy_Screen.Image.Dispose();
                        }));
                }
                ScreenShotPacket screenShotPacket = (ScreenShotPacket)ScreenShotPacket.Deserialize(this.readBuffer);

                int p_length = screenShotPacket.Length;
                //저장될 파일 이름은 receive.jpg로 고정한다.
                string filePath = Environment.CurrentDirectory + "\\" + "receive.jpg";

                FileStream fs;
                //p_length가 음수이면 데이터 완료를 의미한다.(Send 메서드 참고.)
                if (p_length > 0)
                {
                    if (!file_flag)
                    {
                        fs        = new FileStream(filePath, FileMode.Create, FileAccess.Write);
                        file_flag = true;
                    }
                    else
                    {
                        fs = new FileStream(filePath, FileMode.Append, FileAccess.Write);
                    }


                    fs.Write(screenShotPacket.data, 0, 1024);
                    fs.Close();
                }
                else
                {
                    PrintScreenShot(filePath);
                    file_flag = false;
                }
                break;
            }
            }
        }
示例#3
0
        private void Send(string fileName)
        {
            //패킷 전송을 위한 클래스
            ScreenShotPacket ssp = new ScreenShotPacket();

            byte[]     sendData = new byte[1024];
            string     sendPath = Environment.CurrentDirectory + "\\" + fileName;
            FileStream fs       = new FileStream(sendPath, FileMode.Open, FileAccess.Read);
            FileInfo   fi       = new FileInfo(fs.Name);
            long       LengthQ  = fi.Length / 1024;
            long       LengthR  = fi.Length % 1024;
            long       n        = 0;

            //파일을 1024byte만큼 나눠서 보낸다.
            for (n = 0; n < LengthQ; n++)
            {
                fs.Seek(1024 * n, SeekOrigin.Begin);
                fs.Read(sendData, 0, sendData.Length);
                ssp.Type   = (int)PacketType.스샷;
                ssp.Length = sendData.Length;
                ssp.data   = sendData;
                Packet.Serialize(ssp).CopyTo(this.writeBuffer, 0);
                SendData(writeBuffer);
            }
            //남은 부분을 보낸다.
            if ((int)LengthR != 0)
            {
                fs.Seek(1024 * n, SeekOrigin.Begin);
                fs.Read(sendData, 0, 1024);
                ssp.Type   = (int)PacketType.스샷;
                ssp.Length = sendData.Length;
                ssp.data   = sendData;
                Packet.Serialize(ssp).CopyTo(this.writeBuffer, 0);
                SendData(writeBuffer);
            }
            //데이터 전송 완료를 알려주기 위해 Length에 -1을 넣는다.
            ssp.Type   = (int)PacketType.스샷;
            ssp.Length = -1;
            Packet.Serialize(ssp).CopyTo(this.writeBuffer, 0);
            SendData(writeBuffer);

            fs.Close();
        }
示例#4
0
        /// <summary>
        /// スクリーンショットを撮影します。
        /// </summary>
        private Task <Bitmap> TakeScreenShot()
        {
            var source = new TaskCompletionSource <Bitmap>();

            if (Browser == null || !Browser.IsBrowserInitialized)
            {
                return(source.Task);
            }


            var browser = Browser.GetBrowser();

            var KanColleFrame = GetKanColleFrame();

            if (KanColleFrame == null)
            {
                AddLog(3, string.Format("艦これが読み込まれていないため、スクリーンショットを撮ることはできません。"));
                System.Media.SystemSounds.Beep.Play();
                return(source.Task);
            }


            var    request = new ScreenShotPacket(source);
            string script  = $@"
(async function() 
{{
	await CefSharp.BindObjectAsync('{request.ID}');

	var canvas = document.querySelector('canvas');
	requestAnimationFrame(() =>
	{{
		var dataurl = canvas.toDataURL('image/png');
		{request.ID}.complete(dataurl);
	}});
}})();
";

            Browser.JavascriptObjectRepository.Register(request.ID, request, true);
            KanColleFrame.ExecuteJavaScriptAsync(script);

            return(source.Task);
        }