设为首页 收藏本站
查看: 755|回复: 0

基于vc++2008托管代码开发Windows Vista语音识别

[复制链接]

尚未签到

发表于 2015-4-30 10:33:16 | 显示全部楼层 |阅读模式
  废话少说看代码
  #pragma once
#include "Window1.g.h"
#include "Resources.Designer.h"
  using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Data;
using namespace System::Windows::Documents;
using namespace System::Windows::Input;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Imaging;
using namespace System::Windows::Shapes;
  using namespace System::Reflection;
using namespace System::Windows::Threading;
using namespace System::IO;
using namespace System::Xml;
using namespace System::Collections::ObjectModel;
using namespace System::ComponentModel;
  using namespace System::Speech::Recognition;
using namespace System::Speech::Recognition::SrgsGrammar;
using namespace System::Speech::Synthesis;
  namespace speechReco
{
///
/// Interaction logic for Window1.xaml
///
  //ORIGINAL LINE: public partial class Window1 : System.Windows.Window
//INSTANT C++ TODO TASK: C++ does not support 'partial' types. You must manually combine the entire Window1 type in one place.
public ref class Window1 : System::Windows::Window
{
private:
  SpeechRecognizer ^sharedRecognizer;
  SpeechRecognitionEngine ^appRecognizer;
  SrgsDocument ^sdCmnrules;
  public:
  Window1()
  {
   InitializeComponent();
  sharedRecognizer = gcnew SpeechRecognizer();
   sharedRecognizer->AudioLevelUpdated += gcnew EventHandler(this, &Window1::sharedRecognizer_AudioLevelUpdated);
   sharedRecognizer->AudioSignalProblemOccurred += gcnew EventHandler(this, &Window1::sharedRecognizer_AudioSignalProblemOccurred);
   sharedRecognizer->AudioStateChanged += gcnew EventHandler(this, &Window1::sharedRecognizer_AudioStateChanged);
   sharedRecognizer->EmulateRecognizeCompleted += gcnew EventHandler(this, &Window1::sharedRecognizer_EmulateRecognizeCompleted);
   sharedRecognizer->LoadGrammarCompleted += gcnew EventHandler(this, &Window1::sharedRecognizer_LoadGrammarCompleted);
   sharedRecognizer->RecognizerUpdateReached += gcnew EventHandler(this, &Window1::sharedRecognizer_RecognizerUpdateReached);
   sharedRecognizer->SpeechDetected += gcnew EventHandler(this, &Window1::sharedRecognizer_SpeechDetected);
   sharedRecognizer->SpeechHypothesized += gcnew EventHandler(this, &Window1::sharedRecognizer_SpeechHypothesized);
   sharedRecognizer->SpeechRecognitionRejected += gcnew EventHandler(this, &Window1::sharedRecognizer_SpeechRecognitionRejected);
   sharedRecognizer->SpeechRecognized += gcnew EventHandler(this, &Window1::sharedRecognizer_SpeechRecognized);
   sharedRecognizer->StateChanged += gcnew EventHandler(this, &Window1::sharedRecognizer_StateChanged);
  //load SRGS library
   array ^ba = speechReco::Properties::Resources::cmnrules;
   MemoryStream ^ms = gcnew MemoryStream(ba);
   ms->Position = 0;
   XmlReader ^xr = XmlReader::Create(ms);
   sdCmnrules = gcnew SrgsDocument(xr);
   //populate ComboBox
   for each(SrgsRule ^rule in sdCmnrules->Rules)
   {
    if (rule->Scope == SrgsRuleScope::Public)
    {
     cbRules->Items->Add(rule->Id);
    }
   }
   //default to integer rule
   cbRules->SelectedValue = "integer";
   cbRules->SelectionChanged += gcnew SelectionChangedEventHandler(this, &Window1::cbRules_SelectionChanged);
  this->btnSharedColor->Click += gcnew RoutedEventHandler(this, &Window1::btnSharedColor_Click);
   this->btnInProcColor->Click += gcnew RoutedEventHandler(this, &Window1::btnInProcColor_Click);
   this->btnTapDictation->PreviewMouseLeftButtonDown += gcnew MouseButtonEventHandler(this, &Window1::btnTapDictation_PreviewMouseLeftButtonDown);
   this->btnTapDictation->PreviewMouseLeftButtonUp += gcnew MouseButtonEventHandler(this, &Window1::btnTapDictation_PreviewMouseLeftButtonUp);
   this->btnSrgs->Click += gcnew RoutedEventHandler(this, &Window1::btnSrgs_Click);
   this->btnAdvGrammarBuilder->Click += gcnew RoutedEventHandler(this, &Window1::btnAdvGrammarBuilder_Click);
   this->btnWavFile->Click += gcnew RoutedEventHandler(this, &Window1::btnWavFile_Click);
   this->btnSynthPhonemes->Click += gcnew RoutedEventHandler(this, &Window1::btnSynthPhonemes_Click);
   this->btnEnable->Click += gcnew RoutedEventHandler(this, &Window1::btnEnable_Click);
   this->btnDisable->Click += gcnew RoutedEventHandler(this, &Window1::btnDisable_Click);
   this->btnUnload->Click += gcnew RoutedEventHandler(this, &Window1::btnUnload_Click);
   this->btnEmulate->Click += gcnew RoutedEventHandler(this, &Window1::btnEmulate_Click);
  }
  private:
  void btnEmulate_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   //sharedRecognizer.EmulateRecognize("green");
   sharedRecognizer->EmulateRecognizeAsync("green");
   //sharedRecognizer.EmulateRecognize("stop listening");
  }
  void btnUnload_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->UnloadAllGrammars();
  }
  void btnDisable_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = false;
  }
  void btnEnable_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = true;
  }
  System::String ^recoPhonemes;
  void btnSynthPhonemes_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   //this is a trick to figure out phonemes used by synthesis engine
  //txt to wav
   MemoryStream ^audioStream = gcnew MemoryStream();
   SpeechSynthesizer ^synth = gcnew SpeechSynthesizer();
   synth->SetOutputToWaveStream(audioStream);
   PromptBuilder ^pb = gcnew PromptBuilder();
   pb->AppendBreak(PromptBreak::ExtraSmall); //'e' wont be recognized if this is large, or non-existent?
   synth->Speak(pb);
   System::String ^textToSpeak = this->txtSynthTxt->Text->Trim();
   synth->Speak(textToSpeak);
   //synth.Speak(pb);
   synth->SetOutputToNull();
   audioStream->Position = 0;
  //now wav to txt (for reco phonemes)
   recoPhonemes = System::String::Empty;
   GrammarBuilder ^gb = gcnew GrammarBuilder(textToSpeak);
   Grammar ^g = gcnew Grammar(gb); //TODO the hard letters to recognize are 'g' and 'e'
   SpeechRecognitionEngine ^reco = gcnew SpeechRecognitionEngine();
   reco->SpeechHypothesized += gcnew EventHandler(this, &Window1::reco_SpeechHypothesized);
   reco->SpeechRecognitionRejected += gcnew EventHandler(this, &Window1::reco_SpeechRecognitionRejected);
   reco->UnloadAllGrammars(); //only use the one word grammar
   reco->LoadGrammar(g);
   reco->SetInputToWaveStream(audioStream);
   RecognitionResult ^rr = reco->Recognize();
   reco->SetInputToNull();
   if (rr != nullptr)
   {
    recoPhonemes = StringFromWordArray(rr->Words, WordType::Pronunciation);
   }
   txtRecoPho->Text = recoPhonemes;
  }
  void reco_SpeechRecognitionRejected(System::Object ^sender, SpeechRecognitionRejectedEventArgs ^e)
  {
   recoPhonemes = StringFromWordArray(e->Result->Words, WordType::Pronunciation);
  }
  void reco_SpeechHypothesized(System::Object ^sender, SpeechHypothesizedEventArgs ^e)
  {
   recoPhonemes = StringFromWordArray(e->Result->Words, WordType::Pronunciation);
  }
  void btnWavFile_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = false;
  appRecognizer = gcnew SpeechRecognitionEngine();
   appRecognizer->SetInputToWaveFile("spoken.wav");
   appRecognizer->LoadGrammar(gcnew DictationGrammar());
   RecognitionResult ^rr = appRecognizer->Recognize();
   appRecognizer->SetInputToNull();
   if (rr == nullptr)
   {
    MessageBox::Show("null result?");
   }
   else
   {
    //NOTE in-process recognir cannot send feedback to microphone bar
    //SpeechUI.SendTextFeedback(rr, rr.Text, true);
  //show phoneme result
    System::String ^phonemes = StringFromWordArray(rr->Words, WordType::Pronunciation);
    txtRecoPho->Text = phonemes;
  //show text result
    MessageBox::Show(rr->Text);
   }
   delete appRecognizer;
  }
  public:
  enum class WordType
  {
   Text,
   Normalized = Text,
   Lexical,
   Pronunciation
  };
  public:
  static System::String ^StringFromWordArray(ReadOnlyCollection ^words, WordType type)
  {
   System::String ^text = "";
   for each (RecognizedWordUnit ^word in words)
   {
    System::String ^wordText = "";
    if (type == WordType::Text || type == WordType::Normalized)
    {
     wordText = word->Text;
    }
    else if (type == WordType::Lexical)
    {
     wordText = word->LexicalForm;
    }
    else if (type == WordType::Pronunciation)
    {
     wordText = word->Pronunciation;
    }
    else
    {
     throw gcnew InvalidEnumArgumentException(System::String::Format("[0}: is not a valid input", type));
    }
    //Use display attribute
  if ((word->DisplayAttributes & DisplayAttributes::OneTrailingSpace) != 0)
    {
     wordText += " ";
    }
    if ((word->DisplayAttributes & DisplayAttributes::TwoTrailingSpaces) != 0)
    {
     wordText += "  ";
    }
    if ((word->DisplayAttributes & DisplayAttributes::ConsumeLeadingSpaces) != 0)
    {
     wordText = wordText->TrimStart();
    }
    if ((word->DisplayAttributes & DisplayAttributes::ZeroTrailingSpaces) != 0)
    {
     wordText = wordText->TrimEnd();
    }
  text += wordText;
  }
   return text;
  }
  private:
  void btnAdvGrammarBuilder_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = true;
   sharedRecognizer->UnloadAllGrammars();
  //from http://msdn.microsoft.com/msdnmag/issues/06/01/speechinWindowsVista/#S5
   //[I'd like] a [] [] [] pizza [please]
  //build the core set of choices
   Choices ^sizes = gcnew Choices("small", "regular", "large");
   Choices ^crusts = gcnew Choices("thin crust", "thick crust");
   Choices ^toppings = gcnew Choices("vegetarian", "pepperoni", "cheese");
  SemanticResultKey ^srkSize = gcnew SemanticResultKey("size", sizes->ToGrammarBuilder());
   SemanticResultKey ^srkCrust = gcnew SemanticResultKey("crust", crusts->ToGrammarBuilder());
   SemanticResultKey ^srkTopping = gcnew SemanticResultKey("topping", toppings->ToGrammarBuilder());
   SemanticResultValue ^srvSize = gcnew SemanticResultValue(srkSize, "regular");
   SemanticResultValue ^srvCrust = gcnew SemanticResultValue(srkCrust, "thick crust");
  //build the permutations of choices...
   //choose all three
   GrammarBuilder ^sizeCrustTopping = gcnew GrammarBuilder();
   //sizeCrustTopping.AppendChoices(sizes, "size");
   //sizeCrustTopping.AppendChoices(crusts, "crust");
   //sizeCrustTopping.AppendChoices(toppings, "topping");
   sizeCrustTopping->Append(srkSize);
   sizeCrustTopping->Append(srkCrust);
   sizeCrustTopping->Append(srkTopping);
  //choose size and topping, and assume thick crust
   GrammarBuilder ^sizeAndTopping = gcnew GrammarBuilder();
   //sizeAndTopping.AppendChoices(sizes, "size");
   //sizeAndTopping.AppendChoices(toppings, "topping");
   //sizeAndTopping.AppendResultKeyValue("crust", "thick crust");
   sizeAndTopping->Append(srkSize);
   sizeAndTopping->Append(srkTopping);
   //TODO how to set default semantic value for "crust"?
   //sizeAndTopping.Append(srvCrust);
   //sizeAndTopping.Append(new SemanticResultValue(crusts.ToGrammarBuilder(), "thick crust"));
   //sizeAndTopping.Append(new SemanticResultValue("crust", "thick crust"));
   //sizeAndTopping.Append(new SemanticResultValue("thick crust"));
   //sizeAndTopping.Append(new SemanticResultKey("crust", "thick crust"));
  //choose topping only, and assume the rest
   GrammarBuilder ^toppingOnly = gcnew GrammarBuilder();
   //toppingOnly.AppendChoices(toppings, "topping");
   //toppingOnly.AppendResultKeyValue("size", "regular");
   //toppingOnly.AppendResultKeyValue("crust", "thick crust");
   toppingOnly->Append(srkTopping);
   //TODO how to set default semantic value for "size" and "crust"?
   //toppingOnly.Append(srvSize);
   //toppingOnly.Append(srvCrust);
   //toppingOnly.Append(new SemanticResultKey("size", "regular"));
   //toppingOnly.Append(new SemanticResultKey("crust", "thick crust"));
  //assemble the permutations
   Choices ^permutations = gcnew Choices();
   permutations->Add(sizeCrustTopping);
   permutations->Add(sizeAndTopping);
   permutations->Add(toppingOnly);
  //now build the complete pattern...
   GrammarBuilder ^pizzaRequest = gcnew GrammarBuilder();
   //pre-amble "[I'd like] a"
   pizzaRequest->Append(gcnew Choices("I'd like a", "a"));
   //permutations "[] [] []"
   pizzaRequest->Append(permutations);
   //post-amble "pizza [please]"
   pizzaRequest->Append(gcnew Choices("pizza", "pizza please"));
   System::String ^debug = pizzaRequest->DebugShowPhrases;
  //create the pizza grammar
   Grammar ^pizzaGrammar = gcnew Grammar(pizzaRequest);
  //attach the event handler
   pizzaGrammar->SpeechRecognized += gcnew EventHandler(this, &Window1::pizzaGrammar_SpeechRecognized);
  //load the grammar into the recognizer
   sharedRecognizer->LoadGrammar(pizzaGrammar);
  }
  void pizzaGrammar_SpeechRecognized(System::Object ^sender, SpeechRecognizedEventArgs ^e)
  {
   StringBuilder ^resultString = gcnew StringBuilder();
   resultString->Append("Raw text result: ");
   resultString->AppendLine(e->Result->Text);
   resultString->Append("Size: ");
   resultString->AppendLine(e->Result->Semantics["size"]->Value->ToString());
   resultString->Append("Crust: ");
   resultString->AppendLine(e->Result->Semantics["crust"]->Value->ToString());
   resultString->Append("Topping: ");
   resultString->AppendLine(e->Result->Semantics["topping"]->Value->ToString());
   MessageBox::Show(resultString->ToString());
  }
  void cbRules_SelectionChanged(System::Object ^sender, SelectionChangedEventArgs ^e)
  {
   //TODO
  }
  void btnSrgs_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = true;
   sharedRecognizer->UnloadAllGrammars();
  System::String ^ruleName = safe_cast(cbRules->SelectedValue);
   //SrgsRule rule = sdCmnrules.Rules[ruleName];
  Grammar ^grammarSrgs = gcnew Grammar(sdCmnrules, ruleName);
   grammarSrgs->SpeechRecognized += gcnew EventHandler(this, &Window1::grammarSrgs_SpeechRecognized);
  sharedRecognizer->LoadGrammar(grammarSrgs);
   MessageBox::Show("listening for user input based on the selected rule : " + ruleName);
  }
  void grammarSrgs_SpeechRecognized(System::Object ^sender, SpeechRecognizedEventArgs ^e)
  {
   //send text to microphone bar
   SpeechUI::SendTextFeedback(e->Result, e->Result->Text, true);
   //send actual numeric value to TextBox on form
   if (e->Result->Semantics->Value != nullptr)
   {
    this->Dispatcher->Invoke(DispatcherPriority::Render, gcnew UpdateTxtRecoDelegate(UpdateTextReco), e->Result->Semantics->Value->ToString());
   }
  }
  void btnTapDictation_PreviewMouseLeftButtonDown(System::Object ^sender, MouseButtonEventArgs ^e)
  {
   sharedRecognizer->Enabled = false;
  dictationResult = System::String::Empty;
   appRecognizer = gcnew SpeechRecognitionEngine();
   appRecognizer->SetInputToDefaultAudioDevice();
   appRecognizer->SpeechRecognized += gcnew EventHandler(this, &Window1::appRecognizer_SpeechRecognized);
   DictationGrammar ^dg;
   if (cbSpelling->IsChecked == false)
   {
    dg = gcnew DictationGrammar();
   }
   else
   {
    dg = gcnew DictationGrammar("grammar:dictation#spelling");
   }
   appRecognizer->LoadGrammar(dg);
   appRecognizer->RecognizeAsync(RecognizeMode::Multiple);
  }
  System::String ^dictationResult;
  void appRecognizer_SpeechRecognized(System::Object ^sender, SpeechRecognizedEventArgs ^e)
  {
   //on UI thread
   dictationResult += e->Result->Text;
   txtReco->Text = dictationResult;
  }
  void btnTapDictation_PreviewMouseLeftButtonUp(System::Object ^sender, MouseButtonEventArgs ^e)
  {
   appRecognizer->RecognizeAsyncStop();
   delete appRecognizer;
  }
  void btnInProcColor_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = false;
  Choices ^cColor = GetColorChoices();
  GrammarBuilder ^gb = gcnew GrammarBuilder(cColor);
   Grammar ^grammarColors = gcnew Grammar(gb);
   grammarColors->SpeechRecognized += gcnew EventHandler(this, &Window1::grammarColors_SpeechRecognized);
  appRecognizer = gcnew SpeechRecognitionEngine();
   appRecognizer->SetInputToDefaultAudioDevice();
   appRecognizer->LoadGrammar(grammarColors);
   appRecognizer->LoadGrammar(gcnew DictationGrammar());
   appRecognizer->RecognizeAsync(RecognizeMode::Multiple);
  MessageBox::Show("listening for you to say a color (e.g. Green)");
  }
  Choices ^GetColorChoices()
  {
   //build a grammar list of colors
   Choices ^cColor = gcnew Choices();
  Type ^t = Colors::typeid;
   array ^mia = t->GetMembers(BindingFlags::Public | BindingFlags::Static);
   for each (MemberInfo ^mi in mia)
   {
    if (mi->Name->StartsWith("get_") == true)
     continue;
    cColor->Add(mi->Name);
   }
  return cColor;
  }
  void btnSharedColor_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   sharedRecognizer->Enabled = true;
   sharedRecognizer->UnloadAllGrammars();
  Choices ^cColor = GetColorChoices();
  GrammarBuilder ^gb = gcnew GrammarBuilder(cColor);
   Grammar ^grammarColors = gcnew Grammar(gb);
   grammarColors->SpeechRecognized += gcnew EventHandler(this, &Window1::grammarColors_SpeechRecognized);
  sharedRecognizer->LoadGrammar(grammarColors);
   MessageBox::Show("listening for you to say a color (e.g. Green)");
  }
  void grammarColors_SpeechRecognized(System::Object ^sender, SpeechRecognizedEventArgs ^e)
  {
   //not on UI thread
   //txtReco.Text = e.Result.Text;
   //need to use Dispatcher to get back on UI thread
  //TODO cannot convert from 'anonymous method' to 'System.Delegate' ... WTF?
   //this.Dispatcher.Invoke(DispatcherPriority.Render,
   //    delegate()
   //    {
   //        txtReco.Text = e.Result.Text;
   //    });
  //http://romanski.livejournal.com/1761.html
//INSTANT C++ TODO TASK: Anonymous methods are not converted by Instant C++ C# Edition if local variables of the outer method are referenced within the anonymous method:
   this->Dispatcher->Invoke(DispatcherPriority::Render, (System::Windows::Forms::MethodInvoker) delegate(System::Object^ sender, System::EventArgs e));
   {
    txtReco->Text = e->Result->Text;
   }
  //this.Dispatcher.Invoke(DispatcherPriority.Render, new UpdateTxtRecoDelegate(UpdateTextReco), e.Result.Text);
  }
  delegate void UpdateTxtRecoDelegate(System::String ^arg);
public:
  void UpdateTextReco(System::String ^arg)
  {
   txtReco->Text = arg;
  }
  
  #pragma region SHARED_RECOGNIZER_EVENTS
private:
  void sharedRecognizer_StateChanged(System::Object ^sender, System::Speech::Recognition::StateChangedEventArgs ^e)
  {
   System::Console::WriteLine("StateChanged : " + e->RecognizerState.ToString());
  }
  void sharedRecognizer_SpeechRecognized(System::Object ^sender, SpeechRecognizedEventArgs ^e)
  {
   //on UI thread
   System::Console::WriteLine("SpeechRecognized : " + e->Result->Text);
   //txtReco.Text = e.Result.Text;
  }
  void sharedRecognizer_SpeechRecognitionRejected(System::Object ^sender, SpeechRecognitionRejectedEventArgs ^e)
  {
   System::Console::WriteLine("SpeechRecognitionRejected : " + e->Result->Text);
  }
  void sharedRecognizer_SpeechHypothesized(System::Object ^sender, SpeechHypothesizedEventArgs ^e)
  {
   System::Console::WriteLine("SpeechHypothesized : " + e->Result->Text);
  }
  void sharedRecognizer_SpeechDetected(System::Object ^sender, SpeechDetectedEventArgs ^e)
  {
   System::Console::WriteLine("SpeechDetected : " + e->AudioPosition.TotalMilliseconds.ToString());
  }
  void sharedRecognizer_RecognizerUpdateReached(System::Object ^sender, RecognizerUpdateReachedEventArgs ^e)
  {
   System::Console::WriteLine("RecognizerUpdateReached : " + e->AudioPosition.TotalMilliseconds.ToString());
  }
  void sharedRecognizer_LoadGrammarCompleted(System::Object ^sender, LoadGrammarCompletedEventArgs ^e)
  {
   System::Console::WriteLine("LoadGrammarCompleted : " + e->Grammar->Name);
  }
  void sharedRecognizer_EmulateRecognizeCompleted(System::Object ^sender, EmulateRecognizeCompletedEventArgs ^e)
  {
   if (e->Result != nullptr)
   {
    System::Console::WriteLine("EmulateRecognizeCompleted : " + e->Result->Text);
   }
   else
   {
    System::Console::WriteLine("EmulateRecognizeCompleted : null result");
   }
  }
  void sharedRecognizer_AudioStateChanged(System::Object ^sender, AudioStateChangedEventArgs ^e)
  {
   System::Console::WriteLine("AudioStateChanged : " + e->AudioState.ToString());
  }
  void sharedRecognizer_AudioSignalProblemOccurred(System::Object ^sender, AudioSignalProblemOccurredEventArgs ^e)
  {
   System::Console::WriteLine("AudioSignalProblemOccurred : " + e->AudioSignalProblem.ToString());
  }
  void sharedRecognizer_AudioLevelUpdated(System::Object ^sender, AudioLevelUpdatedEventArgs ^e)
  {
   //System.Console.WriteLine("AudioLevelUpdated : " + e.AudioLevel.ToString());
  }
  #pragma endregion
  };
}
  需要的留下eMAIL,我给大家发

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-62191-1-1.html 上篇帖子: 基于vc++2008托管代码开发Windows Vista语音朗读 下篇帖子: windows server 2008 R2上安装MRTG指南
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表