国际棋牌

 
 加入
查看: 161|回复: 6

注册的wm-国际棋牌

  [复制链接]
发表于 2023-10-17 16:47:27 | 显示全部楼层 |


注册的wm_mousemove函数有时候鼠标移动没反应,不晓得是什么原因?


  1. global $k = 0
  2. $gui = guicreate("wm_mousemove 消息", 500, 250)
  3. guictrlcreatelabel('窗口客户区移动鼠标时发送 wm_mousemove 消息.', 5, 5, 380, 34)
  4. $label = guictrlcreatelabel('', 10, 45, 230, 110)
  5. guisetstate()

  6. guiregistermsg(0x0200, "wm_mousemove")

  7. do
  8. until guigetmsg() = -3

  9. func wm_mousemove($hwnd, $imsg, $wparam, $lparam)
  10.     local $key, $x, $y
  11.     $x = bitand($lparam, 0xffff) ; _winapi_loword 低位字
  12.     $y = bitshift($lparam, 16) ; _winapi_hiword 高位字
  13.     $k = 1
  14.     winsettitle($gui, '', '消息发生次数: ' & $k & ' 坐标 x = ' & $x & ', 坐标 y = ' & $y)
  15. endfunc

复制代码

发表于 2023-10-17 18:52:37 | 显示全部楼层
$label = guictrlcreatelabel('', 10, 45, 230, 110) ;范围很大
在控件上是不会有该消息的。
 楼主| 发表于 2023-10-17 19:33:45 | 显示全部楼层

$label = guictrlcreatelabel('', 10, 45, 230, 110) ;范围很大
在控件上是不会有该消息的。

嗯,谢谢!我本来是想获取鼠标在该控件上悬停时的消息,看来用反了。
发表于 2023-10-17 19:41:27 | 显示全部楼层

嗯,谢谢!我本来是想获取鼠标在该控件上悬停时的消息,看来用反了。

这种需求可使用 “控件子类化” 捕获悬停等消息。
当然也可简单的使用 guigetcursorinfo() 循环获取信息
发表于 2023-10-17 21:16:19 | 显示全部楼层
可以这样写:

  1. global $k = 0
  2. $gui = guicreate("wm_mousemove 消息", 500, 250)
  3. guictrlcreatelabel('窗口客户区移动鼠标时发送 wm_mousemove 消息.', 5, 5, 380, 34)
  4. $label = guictrlcreatelabel('', 10, 45, 230, 110)
  5. guisetstate()

  6. do
  7.         $msg = guigetmsg(1)
  8.         _mousemove($msg)
  9. sleep(5)
  10. until guigetmsg() = -3

  11. func _mousemove($imsg)
  12.         if $imsg[0] = 0 then return
  13.     local $key, $x, $y
  14.     $x = $imsg[3]
  15.     $y = $imsg[4]
  16.     $k = 1
  17.     winsettitle($gui, '', '消息发生次数: ' & $k & ' 坐标 x = ' & $x & ', 坐标 y = ' & $y)
  18. endfunc
复制代码
 楼主| 发表于 2023-10-18 12:03:49 | 显示全部楼层

可以这样写:

这样不是用windows消息,谢谢!
发表于 2023-10-18 14:14:03 | 显示全部楼层
本帖最后由 tubaba 于 2023-10-18 14:23 编辑

注册一个窗口处理程序来处理发生的指定消息


#include 
#include
#include
#include
#include
#region ### start koda gui section ### form=
$form1 = guicreate("form1", 357, 167)
$label1 = guictrlcreatelabel("mousehover test", 112, 72, 112, 17)
global $hlabel_callback = dllcallbackregister("_label_callbackfunc", "int", "hwnd;uint;wparam;lparam")
global $hoform_label_callback = _winapi_setwindowlong(guictrlgethandle($label1),  0xfffffffc, dllcallbackgetptr($hlabel_callback))
guisetstate(@sw_show)
#endregion ### end koda gui section ###

while 1
        $nmsg = guigetmsg()
        switch $nmsg
                case $gui_event_close
                        exit

        endswitch
wend

func _label_callbackfunc($hwnd, $imsg, $iwparam, $ilparam)
        #forceref $hwnd, $imsg, $iwparam, $ilparam
        local $ictrl = _winapi_getdlgctrlid($hwnd)
        local const $tme_hover = 0x00000001
        local const $tme_leave = 0x00000002
        switch $ictrl
                case $label1
                        switch $imsg
                                case $wm_mousehover ;鼠标悬停

                                case $wm_mouseleave ;鼠标离开

                                case $wm_mousemove ;鼠标移动
                                        __trackmouseevent($hwnd, bitor($tme_hover, $tme_leave), 1) ;//mouseleave|mousehover消息由此函数触发
                                        local static $n
                                        $n =1
                                        consolewrite('@@ debug(' & @scriptlinenumber & ') : $n = ' & $n & @crlf & '>error code: ' & @error & '    extended code: ' & @extended & ' (0x' & hex(@extended)  & ')    systemtime: ' & @hour & ':' & @min & ':' & @sec & @crlf) ;### debug console
                                case $wm_setcursor ;设置光标
                                        guictrlsetcursor($ictrl, 0)
                                case $wm_lbuttondown
                        endswitch
                        return _winapi_callwindowproc($hoform_label_callback, $hwnd, $imsg, $iwparam, $ilparam)
        endswitch
endfunc   ;==>_label_callbackfunc

func __trackmouseevent($hwnd, $iflags, $itime = -1)
        local $ttme = dllstructcreate('dword;dword;hwnd;dword')
        dllstructsetdata($ttme, 1, dllstructgetsize($ttme))
        dllstructsetdata($ttme, 2, $iflags)
        dllstructsetdata($ttme, 3, $hwnd)
        dllstructsetdata($ttme, 4, $itime)
        local $aret = dllcall('user32.dll', 'bool', 'trackmouseevent', 'struct*', $ttme)
        if @error then return seterror(@error, @extended, 0)
        return $aret[0]
endfunc   ;==>__trackmouseevent





您需要登录后才可以回帖 登录 | 加入

本版积分规则

||小黑屋|国际棋牌 ( ) "));

gmt 8, 2023-12-7 00:58 , processed in 0.089139 second(s), 20 queries .

powered by x3.5

© 2001-2023 .

返回列表
网站地图