Board logo

标题: [原创代码] PowerShell词典第二版,带发音和收藏功能 [打印本页]

作者: went    时间: 2021-6-7 11:30     标题: PowerShell词典第二版,带发音和收藏功能

保存bat或ps1
  1. #&cls&cd /d "%~dp0" & @powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & exit
  2. cls
  3. #------------------------初始化区------------------------------------
  4. [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") #加载WinForm库
  5. [void][System.Reflection.Assembly]::LoadWithPartialName("System.Runtime.Serialization")
  6. [void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework")
  7. $fav = 'MyFavorites.txt'  #收藏单词输出文件
  8. #Windows API
  9. $code=@"
  10.     using System;
  11.     using System.Runtime.InteropServices;
  12.     public static class GetApi{
  13.         [DllImport("user32.dll")]
  14.         public static extern bool SetWindowPos(IntPtr hWnd,IntPtr hWnd0,uint x,uint y,uint cx,uint cy,uint flag); //声明 Windows API 函数
  15.         [DllImport("user32.dll")]
  16.         private static extern bool ShowWindow(IntPtr hWnd,uint showType); //声明 Windows API 函数
  17.         [DllImport("kernel32.dll")]
  18.         private static extern IntPtr GetConsoleWindow(); //声明 Windows API 函数
  19. public static bool ShowConsoleWindow(uint showType){
  20. return ShowWindow(GetConsoleWindow(),showType);
  21. }
  22.     }
  23. "@
  24. Add-Type -TypeDefinition $code
  25. [void][GetApi]::ShowConsoleWindow(0)
  26. $transURL = 'http://dict-co.iciba.com/api/dictionary.php?type=xml&key=C6AAC87C99A4223504F6B7A79C628120&w={0}'
  27. #------------------------界面区-------------------------------------
  28. #0.设置主窗口尺寸
  29. $mainFormWidth = 500                 #主窗口宽度
  30. $mainFormHeight = 400                #主窗口高度
  31. #1.创建主窗口
  32. $form_main = New-Object "System.Windows.Forms.Form"
  33. $form_main.Width = $mainFormWidth                                                   #设置主窗口宽度
  34. $form_main.Height = $mainFormHeight                                                 #设置主窗口高度
  35. $form_main.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen   #主窗口居中屏幕
  36. $form_main.Text = "在线英汉词典 (Ctrl+S)" #主窗口标题
  37. #主窗口置顶
  38. [GetApi]::SetWindowPos($form_main.Handle,-1,$form_main.Location.X,$form_main.Location.Y,$form_main.Width,$form_main.Height,64)
  39. #2.创建输入框
  40. $tb_input = New-Object 'System.Windows.Forms.TextBox'
  41. $tb_input.Height = 20
  42. $tb_input.Width = $form_main.Width
  43. $tb_input.BackColor = '#012456'
  44. $tb_input.ForeColor = 'yellow'
  45. $form_main.Controls.Add($tb_input)
  46. #创建英式音标显示框
  47. $lable_sbol_1 = New-Object 'System.Windows.Forms.Label'
  48. $lable_sbol_1.Location = New-Object 'System.Drawing.Point' 0,$tb_input.Height
  49. $lable_sbol_1.ForeColor = '#00C853'
  50. $lable_sbol_1.BackColor = '#012456'
  51. $lable_sbol_1.Height = 20
  52. $lable_sbol_1.Width = $form_main.Width
  53. $lable_sbol_1.Cursor = [System.Windows.Forms.Cursors]::Hand
  54. $form_main.Controls.Add($lable_sbol_1)
  55. #创建美式音标显示框
  56. $lable_sbol_2 = New-Object 'System.Windows.Forms.Label'
  57. $lable_sbol_2.Location = New-Object 'System.Drawing.Point' 0,($tb_input.Height + $lable_sbol_1.Height)
  58. $lable_sbol_2.ForeColor = '#00C853'
  59. $lable_sbol_2.BackColor = '#012456'
  60. $lable_sbol_2.Height = 20
  61. $lable_sbol_2.Width = $form_main.Width
  62. $lable_sbol_2.Cursor = [System.Windows.Forms.Cursors]::Hand
  63. $form_main.Controls.Add($lable_sbol_2)
  64. #创建显示框
  65. $rtb_show = New-Object 'System.Windows.Forms.RichTextBox'
  66. $rtb_show.Height = $form_main.Height - $tb_input.Height
  67. $rtb_show.Width = $form_main.Width
  68. $rtb_show.Location = New-Object 'System.Drawing.Point' 0,$tb_input.Height
  69. $rtb_show.ForeColor = '#F5F5F5'
  70. $rtb_show.BackColor = '#012456'
  71. $rtb_show.ReadOnly = $true
  72. $rtb_show.BorderStyle = [System.Windows.Forms.BorderStyle]::None
  73. $form_main.Controls.Add($rtb_show)
  74. $whr = New-Object -ComObject 'WinHttp.WinHttpRequest.5.1'
  75. $xmlDoc = New-Object 'System.Xml.XmlDocument'
  76. $player = New-Object 'System.Windows.Media.MediaPlayer'
  77. $Script:query = $false
  78. $endl = "`r`n"
  79. #自定义方法
  80. function Print-Host($obj){ Write-Host ($obj | Out-String) }
  81. #------------------------事件区-------------------------------------
  82. $tb_input.add_KeyDown({
  83.     cls
  84.     [System.Windows.Forms.KeyEventArgs]$e = $_
  85.     if($e.KeyCode -eq [System.Windows.Forms.Keys]::S -and $e.Control){
  86. if(!$Script:query){[System.Windows.Forms.MessageBox]::Show('请先查询数据后再收藏!','提示: ' + $fav);return}
  87. $str = $tb_input.Text.Trim() + $endl + '----' + $endl
  88.         if([System.IO.File]::Exists($fav) -and (Get-Content $fav | Out-String) -match $str){
  89.             [System.Windows.Forms.MessageBox]::Show($str,'提示: 该词条已被收藏过' + $fav)
  90.             return
  91.         }
  92.         $s1 = $lable_sbol_1.Text
  93.         $s2 = $lable_sbol_2.Text
  94.         if($s1 -match '\S'){$str += $s1 + $endl}
  95.         if($s2 -match '\S'){$str += $s2 + $endl}
  96.         $arr = $rtb_show.Text -split '--------------------------------------------'
  97.         $str += $arr[1] + $endl + $arr[2]
  98.         $str = $str -replace '(?m)^\s+$',''
  99.         $str += '***************************************************************'
  100.         Write-Host ('保存:' + $endl + $str)
  101.         $str | Out-File $fav -Encoding utf8 -Append
  102.         [System.Windows.Forms.MessageBox]::Show($str,'提示: 收藏成功! ' + $fav)
  103.     }
  104.     if($e.KeyCode -ne [System.Windows.Forms.Keys]::Enter){return}
  105.     $whr.Open('GET',($transURL -f $tb_input.Text),$false)
  106.     $errMsg = '';
  107.     try{$whr.Send()}catch{$errMsg = $_.Exception.Message}
  108.     if($whr.Status -ne 200){
  109.         [System.Windows.Forms.MessageBox]::Show(('错误代码:{0} {1} {2}' -f $whr.Status,$whr.StatusText,$errMsg),'网络连接失败')
  110.         return;
  111.     }
  112.     $xmlDoc.LoadXml([System.Text.UTF8Encoding]::UTF8.GetString($whr.ResponseBody))
  113.     $lable_sbol_1.Text = $lable_sbol_2.Text = ''
  114.     $lable_sbol_1.Visible = $false
  115.     $lable_sbol_2.Visible = $false
  116.     $rtb_show.Location = New-Object 'System.Drawing.Point' 0,$tb_input.Height
  117.     if ($xmlDoc.dict.ps -is [string]){
  118.         $lable_sbol_1.Visible = $true
  119.         $lable_sbol_1.Text = '  英[{0}]' -f $xmlDoc.dict.ps
  120.         $lable_sbol_1.Tag = $xmlDoc.dict.pron
  121.         $rtb_show.Location = New-Object 'System.Drawing.Point' 0,($tb_input.Height + $lable_sbol_1.Height)
  122.    } elseif ($xmlDoc.dict.ps -is [array]){
  123.         $lable_sbol_1.Visible = $true
  124.         $lable_sbol_2.Visible = $true
  125.         $lable_sbol_1.Text = '  英[{0}]' -f $xmlDoc.dict.ps[0]
  126.         $lable_sbol_1.Tag = $xmlDoc.dict.pron[0]
  127.         $lable_sbol_2.Text = '  美[{0}]' -f $xmlDoc.dict.ps[1]
  128.         $lable_sbol_2.Tag = $xmlDoc.dict.pron[1]
  129.         $rtb_show.Location = New-Object 'System.Drawing.Point' 0,($tb_input.Height + $lable_sbol_1.Height + $lable_sbol_2.Height)
  130.    }
  131.     $str = '--------------------------------------------' + $endl
  132.     if($xmlDoc.dict.pos -is [string]){
  133.         $str += $xmlDoc.dict.pos + $xmlDoc.dict.acceptation
  134.     } elseif ($xmlDoc.dict.pos -is [array]){
  135.         for($i=0;$i -lt $xmlDoc.dict.pos.Count;$i++){
  136.             $str += '{0}{1}' -f $xmlDoc.dict.pos[$i],$xmlDoc.dict.acceptation[$i]
  137.         }
  138.     }
  139.     $str += $endl + '--------------------------------------------'
  140.     if(($str -replace '\s|;|;|-','') -eq ''){$str = ''}
  141.     for($i=0;$i -lt $xmlDoc.dict.sent.Count;$i++){
  142.         $str += $xmlDoc.dict.sent[$i].orig
  143.         $str += $xmlDoc.dict.sent[$i].trans
  144.         $str += '--------------------------------------------'
  145.     }
  146.     #Print-Host -obj $str
  147.     $rtb_show.Text = $str
  148. $Script:query = $true
  149. })
  150. $form_main.add_SizeChanged({
  151.     $tb_input.Width = $rtb_show.Width = $lable_sbol_1.Width = $lable_sbol_2.Width = $form_main.Width
  152.     $rtb_show.Height = $form_main.Height - $tb_input.Height
  153. })
  154. #发音
  155. $lable_sbol_1.add_Click({
  156.     Print-Host ('英式发音:  ' + $this.Tag)
  157.     $player.Stop()
  158.     $player.Open($this.Tag)
  159.     $player.Play()
  160. })
  161. $lable_sbol_2.add_Click({
  162.     Print-Host ('美式发音:  ' + $this.Tag)
  163.     $player.Stop()
  164.     $player.Open($this.Tag)
  165.     $player.Play()
  166. })
  167. #------------------------结  束-------------------------------------
  168. #4.显示主窗口
  169. $form_main.add_Load({$tb_input.Focus()})
  170. $form_main.ShowDialog()
复制代码

作者: jave000    时间: 2021-9-22 23:06

不明觉厉的超强代码。
设置这些貌似都默认了,然后出现一个很小的窗口,我的电脑是三千分辨率,里面的字也特别小。以及标题栏和发音那里都有奇怪的字。
作者: WuZhengQiang    时间: 2023-2-15 00:41

太厉害了,怎么实现的,方便讲一下原理吗?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2