Project1

标题: 谁能帮我看一下这个鼠标。。。 [打印本页]

作者: yangff    时间: 2008-6-19 05:51
标题: 谁能帮我看一下这个鼠标。。。
  1. #==============================================================================
  2. # ■ Mouse
  3. #------------------------------------------------------------------------------
  4. #  不掉FPS的DLL鼠标。
  5. #==============================================================================

  6. class Mouse
  7.   # 定义变量
  8.   DLL = 'Mouse'
  9.   $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  10.   $hWnd = $GetActiveWindow.call
  11.   $Get_Pos_X = Win32API.new(DLL, 'Get_Pos_X', nil, 'l')
  12.   $Get_Pos_Y = Win32API.new(DLL, 'Get_Pos_Y', nil, 'l')
  13.   $Left = Win32API.new(DLL, 'Get_Left', nil, 'l')
  14.   $Right = Win32API.new(DLL, 'Get_Right', nil, 'l')
  15.   $Updata = Win32API.new(DLL, 'Updata_Mouse', nil, 'l')
  16.   $Mouse_Close =  Win32API.new(DLL, 'Mouse_Close', nil, nil)
  17.   $Mouse_Start = Win32API.new(DLL, 'Mouse_Start', 'l', 'l')
  18.   #结束变量的定义
  19.   def init
  20.     $Mouse_Start.call($hWnd)
  21.     @x = 0
  22.     @y = 0
  23.     @left = false
  24.     @right = false
  25.     @cursor = Sprite.new
  26.     @cursor.bitmap = Cache.system("cursor1.png")
  27.     @cursor.z = 99999
  28.   end
  29.   def update
  30.     err = $Updata.call
  31.     if err != 0
  32.       raise "Up Mouse System Error..."
  33.     end
  34.     @x = $Get_Pos_X.call
  35.     @y = $Get_Pos_Y.call
  36.     @cursor.x = @x
  37.     @cursor.y = @y
  38.     l = $Left.call
  39.     r = $Right.call
  40.     if l == 1
  41.       @left = true
  42.     else
  43.       @left = false
  44.     end
  45.     if r == 1
  46.       @right = true
  47.     else
  48.       @right = false
  49.     end
  50.   end
  51.   def end
  52.     $Mouse_Close.call
  53.   end
  54.   def click_on(button)
  55.     if button = "L"
  56.       if @left
  57.         return true
  58.       end
  59.     end
  60.     if button = "R"
  61.       if @right
  62.         return true
  63.       end
  64.     end
  65.   end
  66.   def self.pos
  67.     return @x,@y
  68.   end
  69. end
  70. #==============================================================================
  71. # ■ Graphics
  72. #------------------------------------------------------------------------------
  73. #  图象模块,添加鼠标支持。
  74. #==============================================================================

  75. class << Graphics
  76.   
  77.   alias origin_update update
  78.   
  79.   def update
  80.     origin_update
  81.     $mouse.update
  82.   end
  83.   
  84. end
  85. $mouse = Mouse.new
  86. $mouse.init
复制代码

Dll是自制的哦~~
DLL:http://rpg.blue/upload_program/files/Mouse_94254616.rar
   Dll是米有问题滴~~
能改就改吧。
dll代码
  1. Private Type POINTAPI
  2. x As Long
  3. Y As Long
  4. End Type
  5. Dim p As POINTAPI
  6. Dim l As Long
  7. Dim hd As Long
  8. Dim KeyTepy(1) As Integer
  9. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  10. Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
  11. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
  12. Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
  13. Private Function Get_Pos_X() As Long
  14. If p.x < 0 Then
  15.   p.x = 0
  16. End If
  17. If p.x > 544 Then
  18.   p.x = 544
  19. End If
  20. Get_Pos_X = p.x
  21. End Function
  22. Private Function Get_Pos_Y() As Long
  23. If p.Y < 0 Then
  24.   p.Y = 0
  25. End If
  26. If p.Y > 416 Then
  27.   p.Y = 416
  28. End If
  29. Get_Pos_Y = p.Y
  30. End Function
  31. Private Function Get_Left() As Integer
  32.   Get_Left = KeyTepy(0)
  33. End Function
  34. Private Function Get_Right() As Integer
  35.   Get_Right = KeyTepy(1)
  36. End Function
  37. Private Function Updata_Mouse() As Long
  38. If Mouse_Open = True Then
  39.    Call GetCursorPos(p)
  40.    l = ScreenToClient(hd, p)
  41.    Dim x     As Long
  42.    x = GetAsyncKeyState(1)       '左键
  43.    'KeyTepy = 0
  44.    If x = -32767 Then
  45.      KeyTepy(0) = 1
  46.     Else
  47.      KeyTepy(0) = 0
  48.    End If
  49.    
  50.    x = GetAsyncKeyState(2)       '右键
  51.    If x = -32767 Then
  52.      KeyTepy(1) = 1
  53.     Else
  54.      KeyTepy(1) = 0
  55.    End If
  56.    Updata_Mouse = 0
  57. Else
  58.    Updata_Mouse = 1
  59. End If
  60. End Function
  61. Sub Mouse_Close()
  62.    ShowCursor (1)
  63.    l = ""
  64.    hd = ""
  65.    KeyTepy(0) = 0
  66.    KeyTepy(1) = 0
  67.     Mouse_Open = False
  68. End Sub
  69. Private Function Mouse_Start(hWnd As Long) As Long
  70.    ShowCursor (0)
  71.    hd = hWnd
  72.    Mouse_Open = True
  73.    Mouse_Start = 0
  74. End Function
  75. ''''''''''''''''''''''''''''''''''''''''''''''''
  76. ''    DLL PROJECT ?004 DanSoft Australia     ''
  77. ''   Your dlls MUST HAVE a DLLMain and Main   ''
  78. '' proc, otherwise it won't compile properly! ''
  79. ''''''''''''''''''''''''''''''''''''''''''''''''
  80. Sub Main()
  81.     'This is a dummy, so the IDE doesn't complain
  82.     'there is no Sub Main.
  83. End Sub
  84. Function DLLMain(ByVal hInstDLL As Long, ByVal fdwReason As Long, ByVal lpwReserved As Long) As Long
  85.     DLLMain = 1
  86. End Function

  87. 'add more functions here, ie.
  88. 'Function addition(ByVal A As Double, ByVal B As Double) As Double
  89. '    addition = A + B
  90. 'End Function
复制代码

Dll的输出绝对符合标准!!!
作者: link006007    时间: 2008-6-19 16:39
if button = "R"  这语句拿来干什么用?!{/gg}
其实 默认的鼠标脚本是不会掉FPS的, 只是Win32API.call的次数太多
而且 选择光标巨型的哪个函数是for循环... 选项越多 帧数越低
对了, 默认的鼠标脚本每次call也都要对数组一次unpack和pack, 这样慢
作者: yangff    时间: 2008-6-19 18:50
以下引用link006007于2008-6-19 8:39:22的发言:

if button = "R"  这语句拿来干什么用?!
其实 默认的鼠标脚本是不会掉FPS的, 只是Win32API.call的次数太多
而且 选择光标巨型的哪个函数是for循环... 选项越多 帧数越低
对了, 默认的鼠标脚本每次call也都要对数组一次unpack和pack, 这样慢


[本贴由作者于 2008-6-19 9:19:18 最后编辑]

调用 Clickon时告诉程序要传递的是左键还是右键
作者: 火鸡三毛老大    时间: 2008-6-19 19:46
能响应图片吗?


补:
一进去就错误
{/bz}
作者: yangff    时间: 2008-6-19 19:58
以下引用火鸡三毛老大于2008-6-19 11:46:23的发言:

能响应图片吗?


补:
一进去就错误



[本贴由作者于 2008-6-19 11:51:48 最后编辑]

就是啊,一进去就死机。
响应图片?
不打算写,主战上多了
作者: zlink    时间: 2008-6-19 22:37
if button = "R"
然道不是恒成立吗!?  {/fd}

作者: yangff    时间: 2008-6-19 23:23
以下引用zlink于2008-6-19 14:37:49的发言:

if button = "R"
然道不是恒成立吗!?  

.。。
vb些习惯了 {/fd}

但是,连初始化都不嫩嘎
作者: link006007    时间: 2008-6-20 02:01
你的 Mouse_Start 函数存在bug
不懂VB  只能知道这么多了 。。。。。。
作者: yangff    时间: 2008-6-20 02:04
以下引用link006007于2008-6-19 18:01:54的发言:

你的 Mouse_Start 函数存在bug
不懂VB  只能知道这么多了 。。。。。。

没问题.
所有函数都无法调用哦 {/gg}
作者: link006007    时间: 2008-6-20 02:08
= =  
原来是这样。。。
那可能是VB编译出来的dll问题。。
作者: yangff    时间: 2008-6-20 02:42
以下引用link006007于2008-6-19 18:08:21的发言:

= =  
原来是这样。。。
那可能是VB编译出来的dll问题。。

我制作的另一个Dll(编译方法相同,内容就一个Return)都是正常的
作者: link006007    时间: 2008-6-20 02:47
刚才上网查了一下 ms 不能直接调用VB的dll
应该还是值的类型问题
http://forums.msdn.microsoft.com ... -a4bc-c4dae7101efc/

com 编程是邪恶的。。。
----------------------------------------------------------------------------
好像也不是很对  {/lh}
ruby 和其他语言的交流最终还是要回到C上
ruby 使用C++也需要用到C  orz
作者: yangff    时间: 2008-6-20 23:49
汗死,不是直接调用,有经过处理的

C的代码也有,谁能帮我编译!!!
作者: link006007    时间: 2008-6-21 07:08
我直接用C++写的DirectInput都可以正常调用
话说,你觉得VC++太大的话  可以下载一个Dev-C++
作者: yangff    时间: 2008-6-21 15:40
以下引用link006007于2008-6-20 23:08:24的发言:

我直接用C++写的DirectInput都可以正常调用
话说,你觉得VC++太大的话  可以下载一个Dev-C++


[本贴由作者于 2008-6-21 0:51:09 最后编辑]

为什么我用C++编译不了(绿色环保版不含编译器)
作者: link006007    时间: 2008-6-21 22:45
配置好库路径和头文件路径和编译器路径, 代码没问题的话    应该可以编译
懒得配置就去载安装包 DevC++或者 minGW
--------------------------------------------------------------------------
对了 如果使用的是__stdcall的话, 要写.def导出函数, 不难RM是认不到的
作者: yangff    时间: 2008-6-21 23:51
以下引用link006007于2008-6-21 14:45:45的发言:

配置好库路径和头文件路径和编译器路径, 代码没问题的话    应该可以编译
懒得配置就去载安装包 DevC++或者 minGW
--------------------------------------------------------------------------
对了 如果使用的是__stdcall的话, 要写.def导出函数, 不难RM是认不到的


[本贴由作者于 2008-6-21 14:52:47 最后编辑]

DevC++
编译不能
哇,水能帮给我

作者: link006007    时间: 2008-6-22 07:11
那我就不知道了 我下载的DevC++可以编译的说
作者: 冰水    时间: 2008-6-22 17:43
因为vb编译的dll本身就是不标准的。我记得要改vb配置里某个东西后重编译才能成为标准dll。
baidu vb标准dll应该能找到那篇文章
作者: yangff    时间: 2008-6-22 18:14
以下引用冰水于2008-6-22 9:43:22的发言:

因为vb编译的dll本身就是不标准的。我记得要改vb配置里某个东西后重编译才能成为标准dll。
baidu vb标准dll应该能找到那篇文章

你当我笨蛋啊
当然处理过咯
作者: link006007    时间: 2008-6-22 18:36
没有道理的...  ...
编译器是定死的, 只要代码正确, 设置正确   没什么不能编译

作者: yangff    时间: 2008-6-22 20:33
编译器说自带的一个.h文件100多处错误

说我错误的应用了一个错误的.h文件 {/gg}{/gg}
作者: link006007    时间: 2008-6-22 20:44
C 和 C++ 相互include的时候ms就会出现这种情况

比如一个.c文件include的.h中包含某些C++特性的声明或定义
作者: yangff    时间: 2008-6-22 20:48
没有互相声明啊
作者: link006007    时间: 2008-6-22 20:55
/* CPPCode.h */

namespace CPPNamespace{
class CPPClass;
typedef struct _cppStruct{
   void* member;
   void operator = (const& cppStruct);
}CPPStruct;
};

/* CCodeFile.c */

#include "CPPCode.h"    // 这样就会错了

// ... ...

作者: yangff    时间: 2008-6-22 22:35
以下引用link006007于2008-6-22 12:55:10的发言:

/* CPPCode.h */

namespace CPPNamespace{
class CPPClass;
typedef struct _cppStruct{
  void* member;
  void operator = (const& cppStruct);
}CPPStruct;
};

/* CCodeFile.c */

#include "CPPCode.h"    // 这样就会错了

// ... ...

真的没有这样
作者: yangff    时间: 2008-6-22 22:37
C++
  1. // Mouse Dynamic Link Library.cpp : Defines the entry point for the DLL application.
  2. #include "stdafx.h"
  3. #include <"stdio.h">
  4. #include <"windows.h">
  5. // API
  6. [DllImport("user32.dll")]
  7. public static extern short GetKeyState(int nVirtKey);
  8. public const int VK_LBUTTON = 1;
  9. public const int VK_RBUTTON = 2;

  10. int x,y;
  11. long l;
  12. long hd;
  13. long KeyTepy;
  14. bool Mouse_Open;
  15. // API
  16. CPoint point;
  17. BOOL APIENTRY DllMain( HANDLE hModule,
  18.                        DWORD  ul_reason_for_call,
  19.                        LPVOID lpReserved
  20.                                          )
  21. {
  22.     return TRUE;
  23. }

  24. extern long start(long hWnd)
  25. {
  26.         Mouse_Open = true;
  27.         hd = hWnd;
  28. }

  29. extern long __stdcall Get_Tepy()
  30. {
  31.         return KeyTepy;
  32. }

  33. extern long __stdcall Get_Pos_X()
  34. {
  35. return x;
  36. }

  37. extern long __stdcall Get_Pos_Y()
  38. {
  39. return x;
  40. }

  41. extern long __stdcall Mouse_Close()
  42. {
  43.         Mouse_Open = false;
  44. }

  45. extern int Updata_Mouse()
  46. {
  47.         KeyTepy = 0;
  48.         GetCursorPos(&point);
  49.         ScreenToClient(hd,&print);
  50.         x   =   point.x;
  51.     y   =   point.y;
  52.         if (GetKeyState(VK_LBUTTON) & 0x80) == 0x80
  53.         {
  54.                 KeyTepy = 1;
  55.         };       
  56.         if (GetKeyState(VK_RBUTTON) & 0x80) == 0x80
  57.         {
  58.                 KeyTepy = 2;
  59.         };
  60.     if (((GetKeyState(VK_LBUTTON) & 0x80) == 0x80) &&
  61.        ((GetKeyState(VK_RBUTTON) & 0x80) == 0x80))
  62.         {
  63.         KeyTepy = 3;
  64.         };

  65. }
复制代码

作者: link006007    时间: 2008-6-23 04:28
头文件 <> 就 不要 ""
而且你没有写def...
作者: yangff    时间: 2008-6-23 23:28
以下引用link006007于2008-6-22 20:28:37的发言:

头文件 <> 就 不要 ""
而且你没有写def...

def ?
作者: link006007    时间: 2008-6-24 02:13
以下引用yangff于2008-6-23 15:28:32的发言:
def ?


没有  我可能说错了   不过如果你用__stdcall的话, 写一个def文件导出是必要的...
另, __declspec(dllexport) 没有看到//
作者: yangff    时间: 2008-6-24 02:15
不是学c的,这些代码是拼出来的 {/gg}
作者: link006007    时间: 2008-6-24 02:41
汗...   精神可嘉. 没学就来写了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1