
1 huclengyue 2018-07-25 18:06:03 +08:00 via Android 50 太多了,从没做过这么大的项目。。怎么办。 |
2 RoyLeong 2018-07-25 18:06:40 +08:00 我看成了 50w,抱歉,打扰了 |
3 Antidictator 2018-07-25 18:08:40 +08:00 如果是以技术讨论的形式询问不但不会让人反感,而且说请喝星巴克的话不仅成本会降低而且有更多人愿意帮忙。而不是给人这种你的工作量只值 50 块钱的感觉。 |
4 FanWall 2018-07-25 18:11:28 +08:00 via Android 自行检索 python win32com |
5 keramist 2018-07-25 18:12:57 +08:00 via Android 看来技术真的不值钱 所以你自己弄吧 |
6 Eugene1024 2018-07-25 18:20:53 +08:00 技术看来真的不值钱了 +1 |
7 ayyll 2018-07-25 18:25:18 +08:00 via Android 曾经有过 mfc 转成 py 的经历。。不难吧 你搜搜 复制粘贴巴拉巴拉就完了 |
8 keysona 2018-07-25 18:28:25 +08:00 不好意思,我膨胀了.... |
10 FanWall 2018-07-25 18:36:38 +08:00 via Android @FanWall #4 因为这是**组件对象模型**而不是 DLL,调用的是接口,你应该也可以通过 win32api 实现,但既然用 Python 了,为简单计,依然推荐 win32com 这有啥嘲讽的,这也算值钱的技术?建议楼主去网上找点开发互助群加一加,问基础问题这类群里比较友好,v2ex 适合分手了来问情感问题。 |
11 Beebird 2018-07-25 18:41:45 +08:00 哈哈,看评论乐了。不过我正好有个例子不知道楼主用不用得上 @iMath https://gist.github.com/beebird/9c37adf19a8436ccdd264a9beb09a8d1 |
12 realpg PRO 50 太多了,怕干不好当不起啊 |
13 iMath OP @Antidictator 对于这种问题不给点 money 让人家白白帮我,我觉得也是不现实,但是学生党又拿不出多少来…… |
14 iMath OP |
15 yangguoshuai 2018-07-25 20:06:58 +08:00 via Android @iMath 楼主很隐晦的说大家 talk is cheap。。 |
17 ftdejo 2018-07-25 20:12:12 +08:00 https://stackoverflow.com/questions/252417/how-can-i-use-a-dll-file-from-python 善用谷歌和 Stack Overflow,说实话你这个 50 块是在侮辱你自己的信息获取能力 |
18 FanWall 2018-07-25 20:13:48 +08:00 via Android @iMath #14 手头只有爪机,你就只百度 Python win32com 就有例子了 https://www.cnblogs.com/jasonli-01/articles/6612020.html 为了更方便,可以先用 regsvr32 注册一下 DLL |
19 mritd 2018-07-25 20:23:18 +08:00 via iPhone 你知道,这个帖子最大的败笔是什么么? 如果只是纯技术请教就别谈钱,会的自然告诉你 如果是外包项目就别扯太多技术,更别提整个 50 块钱的事 你说会的人告诉你了,这 50 要还是不要? 要: 打发要饭呢? 不要: 有偿的操作,当外包干的,还得顶着心里压力,不要就亏了 |
20 sagaxu 2018-07-25 20:35:21 +08:00 via Android 50 还不够中饭点个外卖 |
21 prolic 2018-07-25 20:41:04 +08:00 via Android 要是标题没悬赏下面回复就是“课后作业自己做”,“知识付费”乱七八糟的了,合着 v2 一群外包接单的 |
22 xuegj1010 2018-07-25 20:53:15 +08:00 技术无价,你这 50 块钱是在侮辱各位大佬。。。 |
23 liuminghao233 2018-07-25 21:12:52 +08:00 via iPhone 我觉得搞计算机的 花钱让别人帮忙写自己的 project 是一种侮辱自己的行为 |
24 yankebupt 2018-07-25 21:19:05 +08:00 FanWell 正解... 刚想说为啥那么多 wrapper 不用,看了一眼链接发现 COM 的... 微软亲自挖坑咱也没啥可说的... 17 楼那个 stackoverflow 最高票数 ctype 答案有可能不能用,但是楼层里 win32com 那个可能可以用... |
25 agee 2018-07-25 21:20:13 +08:00 via iPhone 貌似问题是没错,错在了提钱,还提个 50 块,哈哈 |
26 iMath OP @FanWall @yankebupt 谢谢两位! 我按文档里的注册了 dll https://sites.google.com/a/deskperience.com/wordcapturexdoc/wcapturex/register-wcapturex 我的命令 C:\Users\i>regsvr32 "C:\Program Files\WordWeb\WCaptureX.dll" 然后我的代码 from win32com.client import Dispatch zk = Dispatch("WCaptureX") 估计也不对,出现如下异常 Traceback (most recent call last): File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\dynamic.py", line 89, in _GetGoodDispatch IDispatch = pythoncom.connect(IDispatch) pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\BaiduYunDownload\编程\Python\Win32COM.py", line 3, in <module> zk = Dispatch("WCaptureXLib") File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch) pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) [Finished in 1.2s] |
27 ysc3839 2018-07-25 21:56:03 +08:00 via Android 我可以免费帮你试试。 要自己研究的话,找 C 语言调用 COM 的代码。 个人理解 COM 接口本质是一个记录函数指针的 struct,取到函数指针后 call 就行了。 |
29 FanWall 2018-07-25 22:07:37 +08:00 via Android @iMath #26 名称参数大概写错了,可以借助你可以跑通的语言或者工具查看一下 https://technet.microsoft.com/en-us/library/d0kh9f4c(fr-fr).aspx 你也可以用 win32api 调用 CreateCOMObject,那就是 #27 的方案,第一次写麻烦点,不过对加深理解非常有帮助。 |
33 iMath OP |
34 iMath OP |
35 ysc3839 2018-07-25 23:51:49 +08:00 @iMath IDispatch 是一个提供了动态特性的 COM 接口,可以实现不固定的函数。一般来说一些较高级的语言会封装这个接口,如 VB C# Delphi,#26 的代码也是使用这个接口。 而 C/C++ 一般不会使用这个接口,因为在没有封装的情况下使用起来较为麻烦。 |
36 ysc3839 2018-07-26 04:51:29 +08:00 via Android 最终选用了 comtypes https://github.com/enthought/comtypes 这个模块。它同时支持一般的 COM 接口以及 IDispatch,且仅依赖内置的 ctypes 模块。 |
37 Leigg 2018-07-26 08:38:28 +08:00 via iPhone 要么你别提钱。 |
38 iMath OP @ysc3839 我误打误撞地似乎找到了可以用的方式,如下 from win32com.client import Dispatch WCaptureX = Dispatch("{8F267988-0CA4-418C-8F94-B4BC5862B390}") print(WCaptureX.GetCursorInfo(None) ) 在我的电脑上,CLSID 是{8F267988-0CA4-418C-8F94-B4BC5862B390},不知道在别的机器上 CLSID 会不会变? |
39 ala2008 2018-07-26 09:28:41 +08:00 或者可以趁此学一下 c++?。。 |
40 iMath OP 谈钱伤感情,我错了,各位! |
41 realpg PRO 看过程,想起了当年被迫在 linux 下调用 dll 的折腾死人的一周 |
42 ioth 2018-07-26 10:26:34 +08:00 给你打个折,48 元。 |
43 AEANWspPmj3FUhDc 2018-07-26 10:38:56 +08:00 "谈钱伤感情,我错了,各位!" 这句话我要反驳一下。 拜托,请问我们有什么感情?不和你谈钱,那谈什么?谈梦想? |
44 reus 2018-07-26 10:57:00 +08:00 钱不多,但有为知识付费的意识,这个难得 |
45 FanWall 2018-07-26 11:02:41 +08:00 via Android |
47 iMath OP @FanWall 谢谢大哥不断的指教! 我现在写出的代码如下 from win32com.client import Dispatch import win32gui import mouse import time from threading import Timer WCaptureX = Dispatch("{8F267988-0CA4-418C-8F94-B4BC5862B390}") WInput = Dispatch("{4B484CCE-9120-49B7-A5F2-B8B183BFD808}") def onMouseClicked(): # x,y=mouse.get_position() # windowHandle = win32gui.WindowFromPoint((x,y)) # windowClassName= win32gui.GetClassName(windowHandle) # print(win32gui.GetClassName(windowHandle)) WInput.Hwnd=None windowHandle,x,y=WCaptureX.GetCursorInfo() WInput.Hwnd=windowHandle WInput.StartX=x WInput.StartY=y # WInput.EndX=x+100 # WInput.EndY=y+100 WResult=WCaptureX.Capture(WInput) print(WResult.TEXT ,WResult.Paragraph ) mouse.on_click(onMouseClicked) # 实际是 released event mouse.wait(button='right', target_types=('double', )) 我试了下 Word 2016 取词也是没问题,但是 Chrome 和 sumatraPDF 之类的软件就无法取词,估计是我没有找到正确的使用方式吧。 据我所知,国内的欧路词典也是用这套工具,该软件在 Chrome 和 sumatraPDF 里取词没问题…… @ysc3839 |
48 lee88688 2018-07-26 11:22:49 +08:00 via Android 我之前用过内置的 ctypes 调用过 dll,感觉还挺好用的你可以去尝试一下 |
50 Mmmmc 2018-07-26 11:37:24 +08:00 看得我五味杂陈 |
51 iMath OP |
52 salamanderMH 2018-07-26 11:42:57 +08:00 其实吧,我觉得,钱不重要 |
53 IbukiSuika 2018-07-26 11:43:24 +08:00 楼主长个记性吧,以后这种别提钱就好了 |
54 yyang179 2018-07-26 12:04:40 +08:00 via Android |
56 cszhiyue 2018-07-26 12:37:06 +08:00 “一般人们总认为要让别人做点事情,就应该给他们奖励,不管多少、 不论大小,有总比没有的好,但其实不然” “第一种方案纯粹依赖人们的内在动力,第二种则 与经济利益挂钩。那么这两种比较而言,哪种方式起到的效果更好呢? 第一种方案中,无偿献血是一种公益行为,人们愿意在这个时候做点贡 献,会自愿参加献血。而第二种方案因为有物质激励,人们自然而然地 会将献血看成一种经济行为。10 元的补助根本就是杯水车薪,数目实在 太小,起不到激励的作用,没有多少人会愿意为了拿到 10 元去卖血。所 以,没奖要比有小奖更能引导人们做好事,或者做我们希望他们做的事。 当然,如果献血给的钱特别多,比如一万元,那自然有很多人愿意去献 血,但我们比较的不是给一万元和不给钱,比如一万元,那自然有很多人愿意去献 血,但我们比较的不是给一万元和不给钱时人们献血的意愿,而是给 10 元和不给钱时人们献血的意愿。 同样,当我还在耶鲁大学念书的时候,经常需要找一些学生帮我做 问卷。当时我还是一个穷学生,付不起多少钱。我发现如果我请别人帮 我做问卷然后给他们 1 美元的报酬,大多数人都不愿意帮我做。后来,我 索性就不给钱了,直接请他们帮我做问卷,这样反而有比较多的人愿意 帮忙。” 摘录来自: 未知作者. “别做正常的傻瓜”。iBooks. |
58 agostop 2018-07-26 13:05:09 +08:00 其实是干技术的,都接受不了技术不值钱这个事实。 |
59 forkon 2018-07-26 13:14:24 +08:00 放了楼主的 50 元吧,他只是出于好意。 |
60 Nostalgiaaaa 2018-07-26 13:15:32 +08:00 这个属于你把工作量化成 50 块钱了。。。一般做程序员的都不会觉得自己好几个小时就值 50,下次直接请教下方向就行了,剩下的自己摸索。 |
61 jianpanxia 2018-07-26 13:40:00 +08:00 这...就值 50? |
62 tjxiter 2018-07-26 14:14:19 +08:00 悬赏 和 50 元 放一起。 让大家开心了一把。 楼主不是坏人。 鉴定完毕。 |
63 njlcazl 2018-07-26 14:37:35 +08:00 为什么大家都把帖子标题里面的“至少”给忽略了 |
65 zhuangzhuang1988 2018-07-26 15:26:02 +08:00 题主搞定没 没搞定告诉你到哪里抄代码 https://bitbucket.org/pyglet/pyglet/src/11fcff3d96d71619d55354bea6a9adc07efc8afc/pyglet/com.py?at=default pyglet 项目,纯 Python 做 opengl 外部 0 依赖 涉及到 windows 上的一些肯定的 ctypes 上 |
66 djxf 2018-07-26 20:46:42 +08:00 via Android 50 元的讨论。 |
67 iMath OP @zhuangzhuang1988 搞定了一部分,见 47 楼 做这种事情,包括你说的那个项目,感觉都还是要懂些 C 或 C++才能入手,不然的话步履维艰啊 |
68 lee88688 2018-07-26 22:58:14 +08:00 via Android @iMath ctypes 调用 dll 函数就像是普通 python 函数调用一样,但是参数必须用 ctypes 中基本数据类型进行包裹,我记得官方网站上有相关教程还比较详细的 |
69 iMath OP @lee88688 3Q !但是在我现在这个应用场景下用 ctypes 调用 dll 函数似乎难度又上了一个层次,我只能写出这种来就进行不下去了 from ctypes import * print(cdll.WCaptureX.CreateCOMObject) |
70 lee88688 2018-07-31 14:58:55 +08:00 via Android @iMath 难度不高,先通过 ctypes 导入 dll 然后准备好参数,通过 ctypes 调用并得到结果,这个流程并没有什么难度,可能只是你不熟悉库,直接百度 google 搜索一些基本教程很快就能上手。 |