WM_COPYDATA进程通信的使用(自制小键盘)
By
admin
at 2017-12-10 • 1人收藏 • 1654人看过
carl有一个进程通信库
process.command
win.sendCopyData
winform.onCopyData
用这个通信 _WM_COPYDATA,,,我分析一个棋牌游戏找发包CALL,找了好久,原来是用_WM_COPYDATA进行通讯的
win.sendCopyData
winform.onCopyData
这个用法还真简单

4 个回复 | 最后更新于 2017-12-10
接着小键盘更新:
增加一个判断键盘是否超出屏幕范围,当超出屏幕范围不能显示完全的话,则将键盘显示在输入框的上部.
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)
}
下面是关于一个输入框的调用:
如果输入框里面的东西发生变化,那么就获取这个消息进行处理,这里是进行比较,如果里面的值大于一个阀值则相对的动作触发.
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;
}
}数字键盘更新:
修改键盘主窗口显示位置函数
自动判断应该显示的位置,不再局限在全屏模式,窗口模式同样可以进行键盘位置显示判定
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)
}
登录后方可回帖
自制数字键盘:
某些时候我们需要点击输入框然后弹出一个特定样式键盘.
现在我遇到的问题是:需要在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();上面点击输入框,用的是 输入框获得焦点 事件.