/// <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()); }
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; } } }
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(); }
/// <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); }