WM_COPYDATA进程通信的使用(自制小键盘)

By admin at 2017-12-10 • 1人收藏 • 712人看过

carl有一个进程通信库

 process.command
win.sendCopyData
winform.onCopyData 

用这个通信 _WM_COPYDATA,,,我分析一个棋牌游戏找发包CALL,找了好久,原来是用_WM_COPYDATA进行通讯的

win.sendCopyData
winform.onCopyData

这个用法还真简单


4 个回复 | 最后更新于 2017-12-10
2017-12-10   #1

自制数字键盘:

某些时候我们需要点击输入框然后弹出一个特定样式键盘.

现在我遇到的问题是:需要在win平板上面运行程序,程序里有几个输入框,里面限定了必须是数字.也就是说,必须弹出纯数字键盘,而且键盘要足够大,因为用到的是触摸,不能利用鼠标和键盘.

我画了一个数字键盘

//数字键盘
import win.ui;
/*DSG{{*/
var winform = win.form(text="数字键盘";right=464;bottom=175;border="none";max=false)
winform.add(
button={cls="button";text='\u2190';left=356;top=6;right=461;bottom=53;font=LOGFONT(h=-32);z=11};
button0={cls="button";text="0";left=356;top=64;right=461;bottom=111;font=LOGFONT(h=-29);z=10};
button1={cls="button";text="1";left=6;top=9;right=111;bottom=56;font=LOGFONT(h=-29);z=1};
button10={cls="button";text="清零";left=355;top=121;right=460;bottom=169;font=LOGFONT(h=-19);z=12};
button2={cls="button";text="2";left=123;top=9;right=228;bottom=56;font=LOGFONT(h=-29);z=3};
button3={cls="button";text="3";left=238;top=9;right=343;bottom=56;font=LOGFONT(h=-29);z=6};
button4={cls="button";text="4";left=6;top=68;right=111;bottom=115;font=LOGFONT(h=-29);z=2};
button5={cls="button";text="5";left=123;top=64;right=228;bottom=111;font=LOGFONT(h=-29);z=5};
button6={cls="button";text="6";left=238;top=64;right=343;bottom=111;font=LOGFONT(h=-29);z=9};
button7={cls="button";text="7";left=6;top=124;right=111;bottom=171;font=LOGFONT(h=-29);z=4};
button8={cls="button";text="8";left=123;top=123;right=228;bottom=170;font=LOGFONT(h=-29);z=8};
button9={cls="button";text="9";left=238;top=122;right=343;bottom=169;font=LOGFONT(h=-29);z=7}
)
/*}}*/
 
//遍历所有类名为"button"的控件(实际上是为了指定所有数字键的事件)
for(name,ctrl in winform.eachControl("button") ){
    ctrl.oncommand = function(id,event){
   //向主窗口发送按键功能码
   win.sendCopyData(mainForm.hwnd,ctrl.text);
  
    }
}
 
//扁平化处理
import win.ui.shadow;
win.ui.shadow(winform,70,7);
 
winform.show() 
win.loopMessage();
return winform;

键盘只负责发送所对应的数字到主程序窗口,而获取到这个指令之后,由主窗口自己分辨处理.

主窗口处理的思路:

当用户点击任意一个输入框,则将输入框选中标志置为相对应的数字,当用户点击了数字键盘里面的数字,主窗口接收到发送回来的数据,通过这个选中标志进行分别处理.

当然,如果用户点击数字键盘之外的任意地方,数字键盘就自动销毁.

主程序示例如下:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=402;bottom=271;border="none")
mainForm.add(
button={cls="button";text="button";left=323;top=233;right=376;bottom=261;z=2};
edit={cls="edit";text="1000";left=53;top=34;right=300;bottom=66;edge=1;num=1;z=1};
edit2={cls="edit";text="edit2";left=64;top=130;right=250;bottom=176;edge=1;multiline=1;z=3}
)
/*}}*/
 
var frmChild,wb = mainForm.loadForm("\res\calc.aardio",mainForm);
frmChild.show(false);
 
var Selectedit = 0;
 
 
function showkey(谁的){
    /*var语句声明的变量作用域限于函数内部*/
       var x,y,cx,cy = 谁的.getPos();
       //在输入框下部显示键盘
       frmChild.setPos(x,y+cy);
        frmChild.show();
        //置顶小数字键盘
        win.setTopmost(frmChild.hwnd)
}
 
 
mainForm.onCopyData = function(data){
 
 
    select(Selectedit) {
        case 1 {
         
            select(data) {
                case '0','1','2','3','4','5','6','7','8','9' {
                    if(tonumber(mainForm.edit.text,10) = 0){
                        mainForm.edit.text = data;
                    }
                    else {
                        mainForm.edit.appendText(data);
                    }
                                     
                }
             
                case '清零' {
                 
                    mainForm.edit.text = 0;
                 
                }
     
                else {
                 
                    if(#mainForm.edit.text == 1){
                        mainForm.edit.text = 0;
                    }
                    else {
                        var str = string.sub(mainForm.edit.text,1,#mainForm.edit.text - 1);
                        mainForm.edit.text = str;
                    }
                     
                }
            }
         
         
             
        }
        case 2 {
         
        select(data) {
            case '0','1','2','3','4','5','6','7','8','9' {
                if(tonumber(mainForm.edit2.text,10) = 0){
                    mainForm.edit2.text = data;
                }
                else {
                    mainForm.edit2.appendText(data);
                }
                                 
            }
         
            case '清零' {
             
                mainForm.edit2.text = 0;
             
            }
 
            else {
             
                if(#mainForm.edit2.text == 1){
                    mainForm.edit2.text = 0;
                }
                else {
                    var str = string.sub(mainForm.edit2.text,1,#mainForm.edit2.text - 1);
                    mainForm.edit2.text = str;
                }
                 
            }
        }
         
         
    }
    }
     
}
 
 
mainForm.wndproc = function(hwnd,message,wParam,lParam){
    select( message ) { 
        case 0x205/*_WM_RBUTTONUP*/,0x201/*_WM_LBUTTONDOWN*/{
            //鼠标右键弹起,下面获取坐标
            //var x,y = win.getMessagePos(lParam);
            frmChild.show(false);
        }
        else{
             
        }
    }
    //无返回值则继续调用默认回调函数
}
 
 
mainForm.button.oncommand = function(id,event){
    //mainForm.msgbox( mainForm.button.text );
    frmChild.close();
    mainForm.close();
     
}
 
mainForm.edit.oncommand = function(id,event){
    //mainForm.msgbox( mainForm.edit.text );
     
     if(  event == 0x100/*_EN_SETFOCUS*/ ){
     Selectedit = 1;
     showkey(owner);
     }
}
     
 
mainForm.edit2.oncommand = function(id,event){
    //mainForm.msgbox( mainForm.edit2.text );
     if(  event == 0x100/*_EN_SETFOCUS*/ ){
     Selectedit = 2;
     showkey(owner);
     }
}
 
mainForm.fullscreen(true);
mainForm.show() 
return win.loopMessage();

上面点击输入框,用的是 输入框获得焦点 事件.

2017-12-10   #2

接着小键盘更新:

增加一个判断键盘是否超出屏幕范围,当超出屏幕范围不能显示完全的话,则将键盘显示在输入框的上部.

function showkey(谁的){
    /*var语句声明的变量作用域限于函数内部*/
       var x,y,cx,cy = 谁的.getPos();
 
       //主窗口大小
       var mainx,mainy,maincx,maincy = mainForm.getPos();
       //小键盘大小
        var calcx,calcy,calccx,calccy = frmChild.getPos();
        //判断有没有在屏幕外
        if( (maincy - calccy) >= (y+cy) ){
        //下部分没有超出屏幕
            frmChild.setPos(x,y+cy);
        }else {
        //下部分超出屏幕,则显示在输入框上部
            frmChild.setPos(x,y-calccy);
        }
         
        frmChild.show();
        win.setTopmost(frmChild.hwnd)
}

2017-12-10   #3

下面是关于一个输入框的调用:

如果输入框里面的东西发生变化,那么就获取这个消息进行处理,这里是进行比较,如果里面的值大于一个阀值则相对的动作触发.

mainForm.axis3_step.oncommand = function(id,event){
    //mainForm.msgbox( mainForm.axis3_step.text );
         
     if(  event == 0x100/*_EN_SETFOCUS*/ ){
     Selectedit = 3;
     showkey(owner);
     }elseif(event == 0x300/*_EN_CHANGE*/){
      if(tonumber(mainForm.axis3_step.text) > 65535){
          mainForm.axis3_step.text = 65535;
          mainForm.axis3_step.bgcolor = 255;
      }else {
          mainForm.axis3_step.bgcolor = 15793151;
      }
       
     }


2017-12-10   #4

数字键盘更新:

修改键盘主窗口显示位置函数

自动判断应该显示的位置,不再局限在全屏模式,窗口模式同样可以进行键盘位置显示判定

function showkey(谁的){
                //主窗口再屏幕中的位置xy和主窗口的长宽
        var x,y,cx,cy = win.getPos(mainForm.hwnd,true);
       //输入框在屏幕中的位置xy和自身的长宽
       var mainx,mainy,maincx,maincy =  win.getPos(谁的.hwnd,true);
       //小键盘大小长宽
        var calcx,calcy,calccx,calccy = frmChild.getPos();
        //判断有没有在屏幕外
        //主窗口位置y+高度cy 小于 输入框位置mainy+输入框高度maincy+键盘                //高度calccy
        if((cy+y) < (mainy+maincy+calccy) ){
            frmChild.setPos(mainx,mainy-calccy);
        }else {
            frmChild.setPos(mainx,mainy+maincy);
        }
             
        frmChild.show();
        win.setTopmost(frmChild.hwnd)
}


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...