吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 535|回复: 6
收起左侧

[其他原创] aardio键盘钩子+桌面歌词实现按键监听输出到光标位置

  [复制链接]
Aoii 发表于 2024-3-14 20:37

KeyTip

初次接触Aardio,参考代码示例实现了的小程序,仅供学习代码书写和娱乐。程序获取光标不准但是没搞懂。

代码逻辑

监听键盘按键,获取光标位置,显示出按键内容。

源代码 代码内容
main.aardio 主窗体文件,实现原子窗体和托盘
\dlg\tip.aardio 键盘钩子,转换按键内容
\lib\app\tip.aardio 桌面歌词效果

main.aardio

import win.ui;
/*DSG{{*/
var winform = win.form(text="keyTip";right=759;bottom=469;border="none";mode="popup")
winform.add()
/*}}*/

//创建互斥体
import process.mutex;
var mutex = process.mutex("互斥体.唯一标识") 
if( mutex.conflict ){
    import win.ui.atom;
    var atom,hwndConflict = win.ui.atom.find("原子窗体.唯一标识")
    if( hwndConflict ) win.setForeground(hwndConflict);
    return;
} 

import win.ui.atom 
winform.atom("原子窗体.唯一标识"); 

import win.util.tray;
winform.tray = win.util.tray(winform);
winform.tray.tip = "keyTip";
winform.tray.pop('keyTip is running',"keyTip...");

winform.onTrayMessage = {
    [0x205/*_WM_RBUTTONUP*/  ] = function(wParam){ 
        win.setForeground(winform.hwnd);

        import win.ui.menu;
        winform.popmenu = win.ui.popmenu(winform);
        winform.popmenu.add('&close',function(){
                winform.close();
            }
        );

        winform.popmenu.popup();
    };
}

//退出消息循环,否则子窗口进程还在
winform.onClose = function(hwnd,message,wParam,lParam){
    win.quitMessage();
}

winform.loadForm("\dlg\tip.aardio");

win.loopMessage();

\dlg\tip.aardio

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add()
/*}}*/

import key.hook;
var hook = key.hook();
import app.tip;
tip = app.tip();
import key.ime.stateBar;
hook.proc = function(msg,vkcode,scancode,injected,flags,timeStamp,extraInfo){
    if( injected ) return;   
    var kn = key.getName(vkcode,true,);
    select(msg) {
        case 0x100/*_WM_KEYDOWN*/ ,0x104/*_WM_SYSKEYDOWN*/{
            import io;
            io.print(kn);
            if(key.ime.capital()){
                kn = string.upper(kn);
            }else{
                kn = string.lower(kn); 
            }

            if(key.getState('SHIFT')){
                select (kn){
                    case '`'{
                        kn = '~';
                    }
                    case '1'{
                        kn = '!';
                    }
                    case '2'{
                        kn = '@';
                    }
                    case '3'{
                        kn = '#';
                    }
                    case '4'{
                        kn = '$';
                    }
                    case '5'{
                        kn = '%';
                    }
                    case '6'{
                        kn = '^';
                    }
                    case '7'{
                        kn = '^';
                    }
                    case '8'{
                        kn = '^';
                    }
                    case '9'{
                        kn = '^';
                    }
                    case '0'{
                        kn = '^';
                    }
                    case '-'{
                        kn = '_';
                    }
                    case '='{
                        kn = '+';
                    }
                    case '['{
                        kn = '{';
                    }
                    case ']'{
                        kn = '}';
                    }
                    case '\\'{
                        kn = '|';
                    }
                    case ';'{
                        kn = ':';
                    }
                    case '\''{
                        kn = '"';
                    }
                    case ','{
                        kn = '<';
                    }
                    case '.'{
                        kn = '>';
                    }
                    case '/'{
                        kn = '?';
                    }
                }
            }    
            tip.text = kn;
            tip.show();
        }
        case 0x101/*_WM_KEYUP*/,0x105/*_WM_SYSKEYUP*/{
            io.print("弹起",kn)
        }  
    }   

}

win.loopMessage();
return winform;

\lib\app\tip.aardio

//tip 简单提示
import win.ui;
import win.ui.menu;
import gdip.pen; 
import gdip.graphics;
import gdip.family;
import gdip.stringformat;
import gdip.lineBrush;
import gdip.path;
import gdi;

namespace app;
class tip{
    ctor(parent,tParam){
    /*DSG{{*/
    this = ..win.form(text="aardio form";right=120;bottom=40;border="none";exmode="toolwindow";mode="popup";parent=parent;topmost=1)
    this.add()
    /*}}*/

    this.transparent(true); 
    this.center();

    this.tipColor1 = 0xFFFFFF00/*起始颜色*/; 
    this.tipColor2 = 0xFF00FFFF/*结束颜色*/;
    this.tipBorder = 0xFF222222;
    this.tipFontName = "Segoe UI";
    this.tipFontSize = 30;
    this.tipOpacity = 130;

    this.wndproc = {
        [ 0xC/*_WM_SETTEXT*/ ] = function (hwnd, uMsg, wParam, lParam) {
            if(lParam){ 
                import winex.caret;
                var caretRect = winex.caret.get();
                if(caretRect){
                    this.setPos(caretRect.left,caretRect.top-30);   
                }       
                var text = ..string.fromUnicode( topointer(lParam),,true ); 
                this.drawString(text);
                this.show(true);     
            }
        };
    }

    import win.timer;
    var timer = win.timer(this);
    timer.onTimer = function(hwnd,msg,id,tick){
        this.show(false);
    };
    timer.setInterval(1000);
    timer.enable();

    };
    drawString =function( text,fontSize,fontName,color1,color2  ){
        if(!fontSize) fontSize = 35;
        if(!fontName) fontName = "Verdana";

        ..gdi.layeredBuffer( this.hwnd, 

            function( hdc,hMemDc,hMemBitmap,width,height ){

                //创建画板
                var graphics = ..gdip.graphics(hMemDc)  

                //加上抗锯齿功能
                graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/;  

                //创建画笔,画笔pen只能画一个轮廓(画线)
                var pen = ..gdip.pen(this.tipBorder, 2,2/*_GdipUnitPixel*/ );

                //创建渐变刷子 
                var brush = ..gdip.lineBrush( 
                    ::POINTF(10,10)/*渐变起始坐标*/, 
                    ::POINTF(100,100) /*渐变终止坐标*/, 
                    this.tipColor1, 
                    this.tipColor2
                ) 

                //创建FontFamily
                var family = ..gdip.family( this.tipFontName ); 

                //创建 stringFormat 
                var format = ..gdip.stringformat(); 

                //设置样式
                format.align = 1/*_GdipStringAlignmentCenter*/; 

                //注意 GDI+ 里使用 RECT F而不是 RECT,这里的F后缀表示参数为 float 浮点数 
                var rcLayout = ::RECTF( , ,width,height);//设置文字区域,

                var path = ..gdip.path( 0/*_GdipFillModeAlternate*/ );  //创建一个文字路径

                //添加文字到上面创建的路径中
                path.addstring(text, family,1/*_GdipFontStyleBold*/, this.tipFontSize * (this.dpiScaleY:1), rcLayout, format);

                graphics.fillPath( brush, path) //fillPath填充路径  
                graphics.drawPath( pen, path) //drawPath描边

                //删除所有GDI+对象  
                brush.delete();
                pen.delete();
                format.delete();
                family.delete();
                path.delete();
                graphics.delete();  

                // 用这个GDI 画好的 DC 代替窗体原来的图形    
                ..gdi.updateLayeredWindow( this.hwnd,hMemDc,::SIZE(width,height) ,..gdi.blendFunction(this.tipOpacity/*透明度*/)  ); 
            }
        )  
    }
}

/**intellisense()
app.tip() = 桌面提示\n!winform.
end intellisense**/

screenshots.gif

免费评分

参与人数 3吾爱币 +7 热心值 +3 收起 理由
5Axi + 1 我很赞同!学到了,加油学习ing
insouther + 1 热心回复!
侃遍天下无二人 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

suv8899 发表于 2024-3-14 21:18
初次学习,好多不懂!
DaKuCha123 发表于 2024-3-14 21:21
dantongdqu 发表于 2024-3-14 21:49
ffaini 发表于 2024-3-14 21:51
不错,学习学习
lemony2025 发表于 2024-3-14 22:13
这软件是不是兼容很多语言同时写的那个
amggg 发表于 2024-3-15 01:16
路过,顶
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-28 02:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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