TC官方合作论坛

 找回密码
 立即注册
查看: 1573|回复: 10

[已解决] TC的窗口不能按下左键来移动,请教下高手,用消息路由怎么....

[复制链接]
发表于 2014-11-12 01:13:02 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
就是按下左键来移动窗口
回复

使用道具 举报

发表于 2014-11-12 17:30:15 | 显示全部楼层
记事本打开没有换行 粘贴出来就好了 蛋疼...
现在一看就有了   把下面这个写在你窗口的消息路由事件的返回 假的上面
if(消息 == 512)//鼠标移动消息
            dllcall("user32.dll","Long","ReleaseCapture")
            dllcall("user32.dll","Long","SendMessageA","Long",window.getmyhwnd(),"Long",161,"Long",2,"Long",1)   
endif
回复 支持 反对

使用道具 举报

发表于 2014-11-12 13:54:54 | 显示全部楼层
在消息路由的 鼠标移动消息里 判断 鼠标指向的是不是需要触发移动的窗口 然后判断鼠标左键是否按下
如果满足 就调用下面这两个API
ReleaseCapture  没有参数
SendMessage(被移动的窗口的句柄,161,2,1)
回复 支持 反对

使用道具 举报

发表于 2014-11-12 15:18:36 | 显示全部楼层
~!!!!
回复

使用道具 举报

 楼主| 发表于 2014-11-12 15:58:33 | 显示全部楼层
q273814 发表于 2014-11-12 13:54
在消息路由的 鼠标移动消息里 判断 鼠标指向的是不是需要触发移动的窗口 然后判断鼠标左键是否按下
如果满 ...

能否 你用dllcall的功能写一下啊 我实验不成功,谢谢啦
回复 支持 反对

使用道具 举报

发表于 2014-11-12 17:24:51 | 显示全部楼层
aimei_8866999 发表于 2014-11-12 15:58
能否 你用dllcall的功能写一下啊 我实验不成功,谢谢啦

我找下我原来的 好久不用TC了 等下
回复 支持 反对

使用道具 举报

发表于 2014-11-12 17:27:08 | 显示全部楼层
呃 好像没有安装TC 我懒得看我把带那部分的整个文件用记事本copy出来你自己找吧
  1. #include"梦千年.t"
  2. #include"jcfz.t"

  3. namespace m1000y


  4. var self,dmui

  5. //对窗口的裁剪
  6. function 裁剪窗体(hwnd)
  7.     x0,y0,x1,y1,x2,y2
  8.     dmui.GetWindowRect(hwnd,x0,y0,0,0)//获取窗口在屏幕上的位置
  9.     dmui.GetClientRect(hwnd,x1,y1,x2,y2)//获取客户区在屏幕上的位置
  10.     //获取窗口要裁剪的范围
  11.     hr=dllcall("gdi32.dll","int","CreateRectRgn","int",x1-x0,"int",y1-y0,"int",x2-x0,"int",y2-y0)
  12.     //对窗口进行裁剪,对裁剪过的区域不显示
  13.     dl=dllcall("user32.dll","int","SetWindowRgn","int",hwnd,"int",hr,"bool",true)
  14. endfunction


  15. //初始化
  16. function init()
  17.     系统.设置路径(辅助.获取资源路径("rc:"))
  18.     绛尘辅助.设定输出编辑框("edit_out")
  19.     绛尘辅助.大漠收费注册(dmui)
  20.     self = window.getmyhwnd()
  21.     m1000y.裁剪窗体(self)
  22.     control.setpos("Static_Caption",0,0,1000,23,0)
  23.     control.setpos("Static_Close",445,1,40,21,0)
  24.     statictext.settext("Static_Caption","梦千年Online打怪辅助")
  25.     按钮.设置背景图("button_addHwnd","rc:添加窗口.bmp",3)
  26.     按钮.设置背景图("button_Start","rc:开始挂机.bmp",3)
  27.     绛尘辅助.输出(绛尘辅助.系统识别(0,0))
  28.     梦千年.config()
  29. endfunction

  30. //消息路由功能
  31. function m1000y_pretranslatemessage(hwnd,message,wParam,lParam,time,x,y)
  32.     if(message == 512)//鼠标移动
  33.         dmui.ScreenToClient(window.getmyhwnd(),0,y)
  34.         if(y<23)
  35.             dllcall("user32.dll","Long","ReleaseCapture")
  36.             dllcall("user32.dll","Long","SendMessageA","Long",window.getmyhwnd(),"Long",161,"Long",2,"Long",1)   
  37.         endif
  38.     endif
  39.     return false
  40. endfunction

  41. //退出
  42. function Static_Close_click()
  43.     dmui = null
  44.     count
  45.     arraysp.size(梦千年.大漠数组,count)
  46.     for(i=0;i<count;i++)
  47.         //梦千年.大漠数组[i].UnBindWindow()
  48.         梦千年.大漠数组[i] = null
  49.     endfor
  50.     help.exit()
  51. endfunction

  52. hwnd

  53. //添加窗口
  54. function button_addHwnd_click()
  55.    
  56.     help.messagebox("点击确定后1秒内鼠标指向目标窗口")
  57.     help.sleep(1000)
  58.    
  59.     //获得窗口句柄
  60.     winhandle = window.getmousemovewndhand()
  61.    
  62.     //判断窗口是否合法
  63.     Caption = window.getwindowcaption(winhandle)
  64.     if(str.findstr(Caption," ")<0)
  65.         绛尘辅助.输出("错误的窗口")
  66.         return 0
  67.     endif
  68.     分割标题
  69.     字符串.分割(Caption," ",分割标题)
  70.     if( (分割标题[0]!="梦千年ol") || (分割标题[1]!="曙光(公测)"))
  71.         绛尘辅助.输出("错误的窗口")
  72.         return 0
  73.     endif
  74.    
  75.     var len//获取当前多开数量 //由于大漠对象的数组和窗口句柄的数组大小一样 所以用只一个变量
  76.     arraysp.size(梦千年.窗口数组,len)
  77.    
  78.     //多开数量+1 重定义数组大小
  79.     梦千年.大漠数组        = arraysp.alloc(梦千年.大漠数组 , true , len + 1)
  80.     梦千年.窗口数组 = arraysp.alloc(梦千年.窗口数组 , true , len + 1)
  81.     梦千年.线程数组 = arraysp.alloc(梦千年.线程数组 , true , len + 1 , 2)
  82.    
  83.     //为多开变量赋值
  84.     //梦千年.大漠数组[len] = com("dm.dmsoft")//创建一个大漠对象要占用10M内存 所以开启的时候创建
  85.     梦千年.窗口数组[len] = winhandle
  86.    
  87.     //用列表框保存窗口信息
  88.     列表框.增加文本("winlist",len&"|"&分割标题[2]&"|"&分割标题[3])
  89.    
  90.     绛尘辅助.输出(Caption)
  91.    
  92. endfunction

  93. 坐标x,坐标y,范围,怪
  94. //开始挂机
  95. function button_Start_click()
  96.     //
  97.    
  98.     if(列表框.得到选项("winlist")==-1)
  99.         返回 0
  100.     endif
  101.     if(radio.getstate("radio_zidongdaguai"))
  102.         wininfo = 数组[3]
  103.         str.split(list.getchecktext("winlist"),"|",wininfo)
  104.         坐标x=edit.gettext("edit_X")
  105.         坐标y=edit.gettext("edit_Y")
  106.         范围 =edit.gettext("edit_R")
  107.         怪   =edit.gettext("edit_N")
  108.         梦千年.线程数组[wininfo[0]][0] = 线程.开启("梦千年.主函数",wininfo[0])
  109.     endif
  110. endfunction

  111. //保存配置
  112. function edit_X_enchange()
  113.     梦千年.savecfg("挂机坐标",编辑框.获得文本("edit_X")&":"&编辑框.获得文本("edit_Y"))
  114. endfunction

  115. function edit_Y_enchange()
  116.     梦千年.savecfg("挂机坐标",编辑框.获得文本("edit_X")&":"&编辑框.获得文本("edit_Y"))
  117. endfunction

  118. function edit_R_enchange()
  119.     梦千年.savecfg("挂机范围",编辑框.获得文本("edit_R"))
  120. endfunction

  121. function edit_N_enchange()
  122.     梦千年.savecfg("怪物名称",编辑框.获得文本("edit_N"))
  123. endfunction


  124. function test_click()
  125.     wininfo = 数组[3]
  126.     str.split(list.getchecktext("winlist"),"|",wininfo)
  127.     //
  128.     //数据.怪物生命(wininfo[0])
  129.     绛尘辅助.大漠收费注册(梦千年.大漠数组[0])
  130.     坐标=数据.读取坐标(0)
  131.     //坐标=数据.怪物坐标(wininfo[0])
  132.     绛尘辅助.输出("坐标:"&坐标[0]&","&坐标[1])
  133. endfunction

  134. endnamespace
  135. //空间结束
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-17 02:15:22 | 显示全部楼层
q273814 发表于 2014-11-12 17:30
记事本打开没有换行 粘贴出来就好了 蛋疼...
现在一看就有了   把下面这个写在你窗口的消息路由事件的返回  ...

现在发现如果使用这个代码,在窗口上按下鼠标左键 窗口可以随便移动了,但是有个问题啊,窗口上的下拉框不可以使用了,能解决下吗大神,谢谢啦
回复 支持 反对

使用道具 举报

发表于 2014-11-17 08:39:56 | 显示全部楼层
aimei_8866999 发表于 2014-11-17 02:15
现在发现如果使用这个代码,在窗口上按下鼠标左键 窗口可以随便移动了,但是有个问题啊,窗口上的下拉框不可 ...

可以用呀 为什么不能用呢
我的是可以的
对了 我上面发的这个代码
里面有个参数 window.getmyhwnd()是获取自身句柄的 这里填的是被移动的窗口
在if语句里消息=512是窗口移动的情况
你可以在这里面加个判断 如果鼠标指向的控件的句柄是你要指定的控件才移动
这样能解决一个问题就是 你鼠标在窗体上某些不需要移动的时候带动窗口的控件上移动
比如在编辑框里 如果不这样判断 你就没办法用鼠标来在编辑框里选中文本 因为一滑动鼠标
窗口就移动了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-17 15:45:53 | 显示全部楼层
q273814 发表于 2014-11-17 08:39
可以用呀 为什么不能用呢
我的是可以的
对了 我上面发的这个代码

你的解释很清楚,这个我放到了 消息过程 就OK了,放在消息路由里 如果给他一个窗口自身的句柄,那么不管是点击窗口上那个控件都可以移动,就算加了判断也不完美,测试的是下拉框, 先获取下下拉框的句柄,然后获取 鼠标指向句柄,或者是 焦点句柄,在512里在判断,如果不等于 下拉框句柄才执行,都不完美,不过你给的这个代码 放到消息过程 完美实现,谢谢啦
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-9-28 20:46 , Processed in 0.060221 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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