一直在使用dtapp大神写的STK在工作时间看股票,简单大方,非常方便。

由于单位使用的是日文的OS,stk的menu显示乱码,最近行情大好,导致使用频率增高,乱码的menu也无法忍受了。

所以下决心自己做一个,这个东东用了大约3天的闲暇时间初步功能完成,现一步一步的说明一下。

先上图

先简单说说实现的功能吧

1.定时刷新股票行情(HttpWebRequest取得新浪行情数据)

2.自定义添加股票,保存到ini文件(ini读写)

3.最小化时隐藏到任务栏,不在taskbar表示,双击任务栏图标启动程序(wpf使用NotifyIcon)

4.热键表示/隐藏(hotkey)

5.保存上次关闭时的位置,存到ini文件中


接下来分别说明一下:

1.定时刷新股票行情(HttpWebRequest取得新浪行情数据)

1             Dim request As WebRequest = HttpWebRequest.Create(String.Format(dataURL, _stockCodes))
2             Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
3             Dim reader As New StreamReader(response.GetResponseStream, Encoding.GetEncoding(response.CharacterSet))
4             Dim html = reader.ReadToEnd()

说明:dataURL是去行情的网址,这里使用的是http://hq.sinajs.cn/list={0}。定时器就是使用的timer代码就不贴了,很简单。

2.自定义添加股票,保存到ini文件(ini读写)

 1 Public Class INIHelper2 3     Private inipath As String = Environment.CurrentDirectory & "\DtStock.ini"4 5     <DllImport("kernel32")> _6     Private Shared Function WritePrivateProfileString(section As String, key As String, val As String, filePath As String) As Long7     End Function8 9     <DllImport("kernel32")> _
10     Private Shared Function GetPrivateProfileString(section As String, key As String, def As String, retVal As StringBuilder, size As Integer, filePath As String) As Integer
11     End Function
12
13     Public Sub IniWriteValue(Section As String, Key As String, Value As String)
14         WritePrivateProfileString(Section, Key, Value, Me.inipath)
15     End Sub
16
17     Public Function IniReadValue(Section As String, Key As String) As String
18         Dim temp As New StringBuilder(500)
19         Dim i As Integer = GetPrivateProfileString(Section, Key, "", temp, 500, Me.inipath)
20         Return temp.ToString()
21     End Function
22
23     Public Function ExistINIFile() As Boolean
24         Return File.Exists(inipath)
25     End Function
26 End Class

说明:这里是把ini读写java基础专门做了一个helper,方便使用,调用的时候如下

'读
iniHelper.IniReadValue(“Stock”, “Code”)
'写
iniHelper.IniWriteValue(“Stock”, “Code”, String.Empty)

3.最小化时隐藏到任务栏,不在taskbar表示(wpf使用NotifyIcon)

 1     Private Sub ShowNotifyIcon()2         _notifyIcon = New NotifyIcon()3         _notifyIcon.Text = "DeskTopStock v1.0"4         _notifyIcon.Icon = ExtractAssociatedIcon(System.Windows.Forms.Application.ExecutablePath)5         _notifyIcon.Visible = True6 7         Dim openMenu As New MenuItem("Add or Setting", AddressOf AddStock)8         Dim aboutMenu As New MenuItem("About us", AddressOf About)9         Dim exitMenu As New MenuItem("Exit me", AddressOf CloseMe)
10
11         _notifyIcon.ContextMenu = New ContextMenu({openMenu, aboutMenu, exitMenu})
12
13         AddHandler _notifyIcon.MouseDoubleClick, AddressOf OnNotifyIconDoubleClick
14     End Sub

说明:引入System.Windows.Forms,绑定上需要用的event就可以了

4.热键表示/隐藏(hotkey)

Imports System.Windows.Forms
Imports System.Windows.Interop''' <summary>
''' 直接构造类实例即可注册
''' 自动完成注销
''' 注意注册时会抛出异常
''' </summary>
Class HotKey'注册系统热键类'热键会随着程序结束自动解除,不会写入注册表
```vbnet
#Region "Member"Private KeyId As Integer'热键编号Private Handle As IntPtr'窗体句柄Private window As Window'热键所在窗体Private Controlkey As UInteger'热键控制键Private Key As UInteger'热键主键Public Delegate Sub OnHotkeyEventHandeler()'热键事件委托Public Event OnHotKey As OnHotkeyEventHandeler'热键事件    Shared KeyPair As New Hashtable()'热键哈希表Private Const WM_HOTKEY As Integer = &H312' 热键消息编号Public Enum KeyFlags'控制键编码MOD_ALT = &H1MOD_CONTROL = &H2MOD_SHIFT = &H4MOD_WIN = &H8End Enum#End Region''' <summary>''' 构造函数''' </summary>''' <param name="win">注册窗体</param>''' <param name="control">控制键</param>''' <param name="key__1">主键</param>Public Sub New(win As Window, control As HotKey.KeyFlags, key__1 As Keys)'构造函数,注册热键Handle = New WindowInteropHelper(win).Handlewindow = winControlkey = CUInt(control)Key = CUInt(key__1)KeyId = CInt(Controlkey) + CInt(Key) * 10If HotKey.KeyPair.ContainsKey(KeyId) ThenThrow New Exception("热键已经被注册!")End If'注册热键If False = HotKey.RegisterHotKey(Handle, KeyId, Controlkey, Key) ThenThrow New Exception("热键注册失败!")End IfIf HotKey.KeyPair.Count = 0 Then'消息挂钩只能连接一次!!If False = InstallHotKeyHook(Me) ThenThrow New Exception("消息挂钩连接失败!")End IfEnd If'添加这个热键索引HotKey.KeyPair.Add(KeyId, Me)End Sub#Region "core"<System.Runtime.InteropServices.DllImport("user32")> _Private Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, controlKey As UInteger, virtualKey As UInteger) As BooleanEnd Function<System.Runtime.InteropServices.DllImport("user32")> _Private Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As BooleanEnd FunctionPrivate Shared Function InstallHotKeyHook(hk As HotKey) As Boolean'安装热键处理挂钩If hk.window Is Nothing OrElse hk.Handle = IntPtr.Zero ThenReturn FalseEnd If'获得消息源Dim source As System.Windows.Interop.HwndSource = System.Windows.Interop.HwndSource.FromHwnd(hk.Handle)If source Is Nothing ThenReturn FalseEnd If'挂接事件source.AddHook(AddressOf HotKey.HotKeyHook)Return TrueEnd FunctionPrivate Shared _status As Boolean = FalsePrivate Shared Function HotKeyHook(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr'热键处理过程If msg = WM_HOTKEY ThenDim hk As HotKey = DirectCast(HotKey.KeyPair(CInt(wParam)), HotKey)_status = hk.window.IsVisibleIf _status Thenhk.window.Hide()_status = FalseElsehk.window.Show()_status = TrueEnd IfEnd IfReturn IntPtr.ZeroEnd FunctionProtected Overrides Sub Finalize()Try'析构函数,解除热键HotKey.UnregisterHotKey(Handle, KeyId)FinallyMyBase.Finalize()End TryEnd Sub#End Region
End Class

说明:这个是网上找到的一个类,作者写的很好,直接使用了(忘记作者的原贴地址了,抱歉!!)
需要在Loaded之后调用,直接初期化一下传入热键就OK了,不写入注册表,程序关掉即释放。

5.保存上次关闭时的位置,存到ini文件中

Private Sub MainWindow_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Closing_iniHelper.IniWriteValue("WinLocation", "Left", CStr(Me.Left))_iniHelper.IniWriteValue("WinLocation", "Top", CStr(Me.Top))
End SubPrivate Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.LoadedIf String.IsNullOrEmpty(_iniHelper.IniReadValue("WinLocation", "Left")) ThenMe.WindowStartupLocation = Windows.WindowStartupLocation.CenterScreenExit SubEnd IfMe.Left = Double.Parse(_iniHelper.IniReadValue("WinLocation", "Left"))Me.Top = Double.Parse(_iniHelper.IniReadValue("WinLocation", "Top"))Dim HotKey As New HotKey(Me, HotKey.KeyFlags.MOD_WIN, Keys.A)
End Sub

复制代码
说明:窗口关闭的时候把位置保存起来,程序启动的时候再读出来,第一次启动程序的时候设定位置为屏幕中央。

最后把XAML贴出来

 1 <Window x:Class="MainWindow"2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4         Title="DeskTopStock" SizeToContent="WidthAndHeight"5         xmlns:my="clr-namespace:DeskTopStock" ResizeMode="CanMinimize" WindowStyle="None" 6         Opacity="0.8" AllowsTransparency ="True" ShowInTaskbar="False" Topmost="True"7          FontSize="11.5" FontFamily="Microsoft YaHei" MouseMove="TitleBar_MouseMove">8 9     <Window.Resources>
10         <my:BackgroundConverter x:Key="myConverter"/>
11
12         <ToolTip x:Key="InforTip">
13             <StackPanel Orientation="Vertical">
14                 <StackPanel Orientation="Horizontal">
15                     <TextBlock Text="{Binding Name}" />
16                     <TextBlock Text=" " />
17                     <TextBlock Text="{Binding Code}"/>
18                 </StackPanel>
19                 <StackPanel Orientation="Horizontal">
20                     <TextBlock Text="昨收盘:" />
21                     <TextBlock Text="{Binding YesterdayClose}"/>
22                 </StackPanel>
23                 <StackPanel Orientation="Horizontal">
24                     <TextBlock Text="今开盘:" />
25                     <TextBlock Text="{Binding TodayOpen}"/>
26                 </StackPanel>
27                 <StackPanel Orientation="Horizontal">
28                     <TextBlock Text="最 高:" />
29                     <TextBlock Text="{Binding High}"/>
30                 </StackPanel>
31                 <StackPanel Orientation="Horizontal">
32                     <TextBlock Text="最 低:" />
33                     <TextBlock Text="{Binding Low}"/>
34                 </StackPanel>
35
36             </StackPanel>
37         </ToolTip>
38
39         <Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}">
40             <Setter Property="Foreground">
41                 <Setter.Value>
42                     <Binding RelativeSource="{RelativeSource Self}" Converter="{StaticResource myConverter}" ConverterParameter="{RelativeSource Self}" />
43                 </Setter.Value>
44             </Setter>
45             <Setter Property="ToolTip" Value="{Binding Source={StaticResource InforTip}}" />
46         </Style>
47
48     </Window.Resources>
49     <Grid>
50         <Grid.RowDefinitions>
51             <RowDefinition Height="22" />
52             <RowDefinition Height="*" />
53             <RowDefinition Height="20" />
54         </Grid.RowDefinitions>
55         <DockPanel Background="AntiqueWhite" >
56             <Button Name="C" ToolTip="关闭" Width="30" Height="20" Content="X" />
57             <Button  Width="30" ToolTip="隐藏" Height="20" Content="—" Name="Button1" />
58             <Button Name="Add" ToolTip="添加股票" Width="30" Height="20" Content="十" Margin="5,0,0,0" Command="{Binding AddCommand}" HorizontalAlignment="Left"
59                     CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}}" />
60         </DockPanel>
61
62         <ListView HorizontalAlignment="Stretch" Name="ListView1" ItemsSource="{Binding StockCollection}" VerticalAlignment="Stretch"
63                   ItemContainerStyle="{StaticResource myItemStyle}" Grid.Row="1" >
64             <ListView.View>
65                 <GridView>
66                     <GridViewColumn Width="60" Header="简称" DisplayMemberBinding="{Binding Name}" />
67                     <GridViewColumn Width="75" Header="最新价" DisplayMemberBinding="{Binding Current}"/>
68                     <GridViewColumn Width="65" Header="涨跌额" DisplayMemberBinding="{Binding ZDF}"/>
69                     <GridViewColumn Width="60" Header="涨跌幅" DisplayMemberBinding="{Binding ZDF2}"/>
70                 </GridView>
71             </ListView.View>
72         </ListView>
73         <TextBlock Text="数据更新中,请稍候.." Visibility="{Binding IsUpdateVisilility}" HorizontalAlignment="Left" Grid.Row="2"/>
74         <TextBlock Grid.Row="2" HorizontalAlignment="Right" Text="{Binding DateString}"/>
75     </Grid>
76 </Window>

说明:1.BackgroundConverter是控制ListView的行颜色的,上涨的时候是红色,跌的时候绿色vb.net教程 2.InforTip是Tooltip的显示内容
如有想需要代码或者程序的同学给我地址即可。

WPF+VB.net制作桌面股票小助手相关推荐

  1. 软件:股票小助手/盯盘小助手!

    软件:股票小助手/盯盘小助手 功能: 1.隐蔽,能和常用工作软件融为一体,即使被领导同事看见屏幕,也察觉不了: 2.能实时更新数据,不能有更新频率限制: 3.能设置目标上限,下限价,达到目标后已隐蔽的 ...

  2. 如何用mind+制作一个语音小助手

    要求: 用mind+的实时模式来制作一个语音小助手来进行语音对话,可以实现语音问答,语音学习.前者指的是用户可以与语音智能小助手形成问答的形式,语音学习,后者语音学习的指的是采取机自我学习的形式,即语 ...

  3. 基于 WPF + Modern UI 的 公司OA小助手 开发总结

    前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...

  4. Python利用tkinter制作桌面翻译小工具

    很早之前写过一个金山翻译的爬取小程序,最近突然想到是不是可以拿来做个桌面小工具,于是花了一个下午加一晚上,折腾了一下. 运行平台:Windows Python版本:Python3.6 IDE:Subl ...

  5. 隐形的桌面股票小程序 STK 2.0.3.1

    最新的 STK 2.0.3.1 终于开发完成了,加入了网易的数据来源,修正了棘手的网络代理问题,软件窗口比QQ还小,边工作边看行情,一点都不费事,在桌面上看行情 - 容易,哈哈. 在这里下载STK

  6. 使用OLAMI自然语言开放平台提供的API接口制作自己的语音助手

    告诉你如何使用OLAMI自然语言理解开放平台API制作自己的智能对话助手 我们经常在电影中看到机器和人对答如流,随着越来越多自然语言开放平台的出现,IT爱好者制作一个自己的APP或者小玩具等逐渐可以变 ...

  7. 使用pyqt5制作简单时钟小工具

    一.概述 本文我们将介绍如何使用python+pyqt5在制作桌面时钟小工具 二.引言 此篇文章是我在学习pyqt5中多线程相关的Qtimer时,随手制作的小工具,最终打包成exe可执行文件在桌面随时 ...

  8. wpf 客户端【JDAgent桌面助手】详解(二)桌面宠物制作详解

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图(此文 由于当时没有开通csdn博客所以在博客园发了,后续文章都是csdn 首发奥) [晒视频了]业余开发wpf 客户端[JDAgent桌面助 ...

  9. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  10. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示...

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

最新文章

  1. jquery版本冲突问题
  2. CSS 圣杯布局升级版---多个固定宽度一个自适应宽度
  3. clion register
  4. Java中关于==和equal的区别 以及equals()方法重写
  5. h5 时间控件问题,怎么设置type =datetime-local 的值
  6. D3Vueecharts个人乱记
  7. bugly中批量隐藏版本
  8. 分布式锁的多种实现方式
  9. 暑期训练日志----2018.8.22
  10. java wav合并_用Java串联WAV文件
  11. cout 数组_C++数组|快速排序、二分法查找及其时间复杂度
  12. ORA-01403: no data found
  13. 键盘可以实现向计算机输入数据判断,计算机应用基础—学习指南.docx
  14. 通过 Powershell 来替换 ARM 模式下虚拟机的网络接口
  15. 下列关于linux扩展名说法错误的是,全国计算机一级考试选择题集锦(2015年1月)
  16. 反激式开关电源设计资料
  17. 全面解析云智慧数据中心统一运管解决方案
  18. 如何将qlv格式转换为mp4格式?怎么将qlv的文件然后转换成mp4视频?
  19. python实现指纹识别毕业论文_指纹识别系统设计毕业论文+开题报告+翻译及原文+设计源码...
  20. 用黑莓手机来使电脑上网

热门文章

  1. win10系统如何打开telnet服务器,win10系统安装并开启Telnet服务的处理步骤
  2. 罗马数字转换python_罗马数字转整数 python
  3. 计算机坏处英语,玩电脑的危害英语作文,沉迷电脑的危害英语作文!
  4. 《下学梯航》(全文)
  5. QTreeWidget 设置图片以及图片大小
  6. 农行笔试题之多少年后两国人均GDP相等
  7. xp系统计算机怎么连接到网络打印机,XP系统找不到网络打印机如何解决?
  8. 计算机二级word插入目录,Word 2010编辑目录的两种方法,你会吗?
  9. 微信聊天记录删除了怎么恢复
  10. android扫描局域网打印机,Android 浅谈同一局域网下使用WiFi连接打印机