吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12012|回复: 45
收起左侧

[原创工具] ===C#屏幕取词Demo热键版&鼠标划词版【含语音版】【附源码】===

[复制链接]
angelkyo 发表于 2018-3-11 14:05
本帖最后由 angelkyo 于 2018-3-12 20:56 编辑

sp180311_135437.png

选择文本,按下F7
附源码,调用的Ctrl+C方式,还是感觉不太完美
会C#的大神不要藏着掖着,谁会用C#实现这个帖子的取词功能就完美了
https://www.52pojie.cn/thread-706297-1-1.html

希望不要总是拿来主义
希望不要总是只进不出


热键F7版
C#屏幕取.rar (12.81 KB, 下载次数: 81)
C#屏幕取词源码.rar (829.83 KB, 下载次数: 189)

鼠标划词版
成品: GetSelectedText_mouse.rar (28.1 KB, 下载次数: 134)
源代码: GetSelectedText.rar (858.28 KB, 下载次数: 236)

划词语音版:
sp180312_202030.png
GetSelectedText_语音版.rar (90.52 KB, 下载次数: 33)

语音就简单了,一行代码完事,如果需要日语什么的,lan=zh 改为 lan=ja,当然文本框里也得是日语。。。
[C#] 纯文本查看 复制代码
 
 private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
        {
            this.axWindowsMediaPlayer1.URL = @"http://fanyi.baidu.com/gettts?lan=zh&text=" + textBox1.Text;
        }

另:WIN32 API方法不可取,无法获取浏览器里选择的文本
[C#] 纯文本查看 复制代码
        #region Win32 API 方法
        #region SendMessage 重载
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        private static extern bool SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wparam, IntPtr lparam);

        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        private static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);        
        #endregion

        private const uint WM_GETTEXTLENGTH = 0x000E;
        private const uint WM_GETTEXT = 0x000D;
        private const uint EM_GETSEL = 0xB0;

        [DllImport("user32.dll", ExactSpelling = true)]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", ExactSpelling = true)]
        private static extern IntPtr GetFocus();

        [DllImport("user32.dll", SetLastError = true)]
        private static extern int GetWindowThreadProcessId(int handle, out int processId);

        [DllImport("user32", SetLastError = true, ExactSpelling = true)]
        private static extern int AttachThreadInput(int idAttach, int idAttachTo, bool fAttach);

        [DllImport("kernel32.dll")]
        private static extern int GetCurrentThreadId();
        #endregion




private string GetTextFromWin32Api()
        {
            //获取活动窗口的控件hWnd
            int activeWinPtr = GetForegroundWindow().ToInt32();
            int activeThreadId = 0;
            int processId;
            activeThreadId = GetWindowThreadProcessId(activeWinPtr, out processId);
            int currentThreadId = GetCurrentThreadId();
            if (activeThreadId != currentThreadId)
                AttachThreadInput(activeThreadId, currentThreadId, true);
            IntPtr activeCtrlId = GetFocus();

            //获取全部文本长度
            int textlength = (int)SendMessage(activeCtrlId, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero) + 1;

            //Have any text at all?
            if (textlength > 0)
            {
                //Get selection
                int selstart;
                int selend;
                SendMessage(activeCtrlId, EM_GETSEL, out selstart, out selend);

                StringBuilder sb = new StringBuilder(textlength);
                SendMessage(activeCtrlId, WM_GETTEXT, (IntPtr)textlength, sb);

                //Slice out selection
                string value = sb.ToString();
                sb.Clear();
                if ((value.Length > 0) && (selend - selstart > 0) && (selstart < value.Length) && (selend < value.Length))
                    return value.Substring(selstart, selend - selstart);
            }

            //失败返回null
            return null;
        }


免费评分

参与人数 18吾爱币 +25 热心值 +22 收起 理由
ps5201314 + 1 我很赞同!
why008 + 1 + 1 谢谢@Thanks!
wu1989312 + 6 + 6 谢谢@Thanks!
xiaoz165748 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
JinDex + 1 + 1 大佬
forfor + 1 谢谢@Thanks!
yangrenyi + 1 谢谢@Thanks!
qingcao213 + 1 + 1 谢谢@Thanks!
安静的石头 + 1 + 1 谢谢@Thanks!
只为改变世界 + 1 + 1 是截图识别文字的那种吗?欢迎继续升级……
ryoichi + 1 + 1 谢谢@Thanks!
Monitor + 1 + 1 感谢开源
叶泉 + 1 + 1 感谢发布原创作品,正好需要,谢啦老兄
jnez112358 + 1 谢谢@Thanks!
Quincy379 + 1 + 1 我很赞同!
Hmily + 6 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zq8389937 + 1 + 1 用心讨论,共获提升!
pbgz + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| angelkyo 发表于 2018-3-11 17:36
天若幽心 发表于 2018-3-11 17:33
你如果想达到选中文字自动取词的功能的话
建议你监控左键弹起事件
左键弹起时,模拟按键ctrl+c,然后给文 ...

那么问题来了,比如点击浏览器最小化按钮时,弹起的瞬间就卡住了,因为弹起被拦截了,相当于执行了
1.按下最小化
2.CTRL+C

然后就卡住。。。
 楼主| angelkyo 发表于 2018-3-11 14:20
pbgz 发表于 2018-3-11 14:12
这个与帖子;里面的成品有什么区别啊?

区别是,那个GetWord.dll不是调用的Ctrl+C
也不用按热键
这个C#版我也试过全局鼠标钩子,钩的鼠标左键弹起,但在点击一些窗口最小化按钮时,鼠标左键弹起的瞬间,就卡住了。。。
pbgz 发表于 2018-3-11 14:12
pbgz 发表于 2018-3-11 15:17
angelkyo 发表于 2018-3-11 14:20
区别是,那个GetWord.dll不是调用的Ctrl+C
也不用按热键
这个C#版我也试过全局鼠标钩子,钩的鼠标左键 ...

哪个方便些啊!
陌宇轩 发表于 2018-3-11 15:43

谢谢楼主分享
Quincy379 发表于 2018-3-11 15:44
感谢感谢,分享是一种美德!
l99650 发表于 2018-3-11 16:17
你一直搞这个取词是想干嘛
 楼主| angelkyo 发表于 2018-3-11 16:41
l99650 发表于 2018-3-11 16:17
你一直搞这个取词是想干嘛

学习。还能干嘛呢
天若幽心 发表于 2018-3-11 17:19
屏幕取词这个意义说实话不是很大,ctrl+c就够用了,调用api效率太低。
 楼主| angelkyo 发表于 2018-3-11 17:26
天若幽心 发表于 2018-3-11 17:19
屏幕取词这个意义说实话不是很大,ctrl+c就够用了,调用api效率太低。

引用最近流行的一句话:用心讨论,共获提升!哈哈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 06:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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