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

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

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)
}


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...