ruby - 尝试用 Ruby 显示气球通知

标签 ruby winapi

我正在尝试用 ruby​​ 编写一个小类,允许我制作一个系统托盘图标并使用通知气球。但是我在将结构与 Win32API 调用结合使用时遇到问题。

http://www.ruby-forum.com/topic/18102
Shell_NotifyIcon Function
NOTIFYICONDATA Struct

这是我现在的代码,它所做的只是向系统托盘添加一个图标:

require 'Win32API'

NIF_MESSAGE = 1
NIF_ICON    = 2
NIF_TIP     = 4
NIF_STATE   = 8
NIF_INFO    = 10

NIM_ADD     = 0
NIM_MODIFY  = 1
NIM_DELETE  = 2

NIS_HIDDEN     = 1
NIS_SHAREDICON = 2

class NotifyIconData < Struct.new(:cbsize, :hwnd, :uid, :uflags, :ucallbackmessage, :hicon)#, :sztip, :dwstate, :dwstatemask, :szinfo, :utimeout, :uversion, :szinfotitle, :dwinfoflags, :guiditem, :hballoonicon)
    def pack
        values.pack('LLIIIL')
    end
    # def self.unpack(s)
        # new(*s.unpack('LLIIIL'))
    # end
end

#===---

ExtractIcon       = Win32API.new('shell32',  'ExtractIcon',       'LPI', 'L')
Shell_NotifyIcon  = Win32API.new('shell32',  'Shell_NotifyIconA', 'LP',  'I')

hicoY = ExtractIcon.call(0, 'C:\WINDOWS\SYSTEM32\INETCPL.CPL', 21)  # Green tick
hicoN = ExtractIcon.call(0, 'C:\WINDOWS\SYSTEM32\INETCPL.CPL', 22)  # Red minus

#===---

tiptxt = "hai"

nid = NotifyIconData.new
nid.cbsize           = Marshal.dump(NotifyIconData).size#6*4+64
nid.hwnd             = 0
nid.uid              = 'ruby'.hash
nid.uflags           = NIF_INFO
nid.ucallbackmessage = 0
nid.hicon             = hicoY

ret = Shell_NotifyIcon.call( NIM_ADD, nid.pack << tiptxt << "\0"*(64 - tiptxt.size) )
p 'Err: NIM_ADD' if ret == 0

      sleep(3)   #  <----<<

# pnid = [6*4+64, 0, 'ruby'.hash, NIF_ICON | NIF_TIP, 0, hicoN].pack('LLIIIL') << tiptxt << "\0"*(64 - tiptxt.size)
# ret = Shell_NotifyIcon.call(NIM_MODIFY, pnid)
# p 'Err: NIM_MODIFY' if ret == 0

      # sleep(6)   #  <----<<
nid.uflags = 0

ret = Shell_NotifyIcon.call( NIM_DELETE, nid.pack << "\0" )
p 'Err: NIM_DELETE' if ret == 0

最佳答案

查看 visualuruby及其演示/示例文件。他们很容易地给我买了一些气球。

关于ruby - 尝试用 Ruby 显示气球通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2137836/

相关文章:

ruby-on-rails - 如何使用 Ruby New Relic 代理获取更详细的事务跟踪

c++ - 是否可以通过 Windows 键(可能没有钩子(Hook))捕获 Windows 开始菜单弹出窗口?

c - "Size in TCHARs"是什么意思?

ruby-on-rails - 在 ruby​​ 中批量创建具有嵌套属性的对象

c++ - 如何等到互斥体解锁?

c++ - 创建带有子窗口(控件)的分层窗口的策略

c++ - 如何在 Windows 中使用与父进程相同的环境变量加上它自己的子进程?

mysql - ubuntu 14.04 redmine安装失败

ruby - 正则表达式错误 : too many multibyte code ranges are specified

html - Rails - 在表单中输入 html 时关闭 html 标签