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**/