Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4728189
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类: WINDOWS

2011-04-04 23:45:32

//窗口库 
//注释//注释描述 
var u = ::User32;
var k = ::Kernel32;

//取高位、低位、合并
/*intellisense(::)*/

::LOWORD = 
function(l) {return l & 0xffff }
::HIWORD = 
function(l) {return  (l >> 16) & 0xffff }
::MAKELONG = 
function(a,b){ return ( ( (b & 0xFFFF) << 16) | (a & 0xFFFF) ) & 0xFFFFFFFF } 
::LOBYTE = 
function(l) {return l  & 0xff }
::HIBYTE = 
function(l) {return   (l   >> 8) & 0xff  }
::MAKEWORD = 
function (a,b){ return ( ( ( b & 0xFF) << 8) | ( a & 0xFF) ) & 0xFFFF  } 
/*end intellisense*/

/*intellisense(::)
::MAKELPARAM = @MAKELONG(__,)
::MAKEWPARAM = @MAKELONG(__,)
end intellisense*/

 
//结构体
 /*intellisense(::)*/
 
::MSG = 
class
    int hwnd;
    INT message;
    int wParam;
    int lParam;
    INT time;

    struct pt = {
        INT x;
        INT y;
    }; 
}  

::RECT = 
class{
    
ctor(left=0,top=0,right=0,bottom=0){
        
this.left = left;
        
this.top = top;
        
this.right = right;
        
this.bottom = bottom;
    } 
    int left;
    int top;
    int right;
    int bottom;
}

::POINT = 
class{
   
ctor(x=0,y=0){
      
this.x = x;
      
this.y = y;
   } 
   int x ; 
   int y ;
}

::SIZE = 
class{
    int cx=0;
    int cy=0;
}
  

//系统 API
::GetModuleHandle = k.api( "GetModuleHandleA""pointer(string)")  
::GetSystemMetrics = u.api(
"GetSystemMetrics","int(int)"
::CreateWindowEx = u.api( 
"CreateWindowExA"" int(INT dwExStle,string IpClassName,string lpWindowName,INT dwStyle,int x,int y,int nWidth,
                    int nHeight,int hWndParent,int hMenu,pointer hlnstance,pointer lpParam)"
 )  
::DestroyWindow = u.api( 
"DestroyWindow""int(int hWnd )" );   
                
//窗口 API
::CallWindowProc = u.api("CallWindowProcA","int(pointer lpPrevWndFunc,int hWnd,INT Msg,int wParam,int lParam)" )
::SetWindowPointer = u.api(
"SetWindowLongA","pointer(int hWnd,int nIndex,pointer ptrNew)" ) 
::SetWindowLong = u.api(
"SetWindowLongA","int(int hWnd,int nIndex,int dwNewLong)" )
::GetWindowLong = u.api(
"GetWindowLongA","int(int hWnd,int nIndex)" ) 
::UpdateWindow = u.api( 
"UpdateWindow"" int(int) " ) 
::InvalidateRect = u.api( 
"InvalidateRect"" int(int hWnd,struct lpRect,int bErase) " )  
::RedrawWindow = u.api(
"RedrawWindow","int(int hwnd,struct lprcUpdate,pointer hrgnUpdate,INT flags)");
::GetWindowRect = u.api( 
"GetWindowRect"" int(int hWnd,struct &lpRect ) " )
::GetClientRect = u.api( 
"GetClientRect"" int(int hWnd,struct &lpRect ) " )
::ScreenToClient = u.api( 
"ScreenToClient"" int(int hWnd,struct &lpPoint ) " )
::ClientToScreen = u.api( 
"ClientToScreen"" int(int hWnd,struct &lpPoint ) " )
::OffsetRect = u.api( 
"OffsetRect""int( struct &lprc, int dx, int dy )" );
::PtInRect = u.api( 
"PtInRect""int(struct, int, int)" );
::MoveWindow = u.api( 
"MoveWindow""int( int hWnd, int X,int Y,int nWidth,int nHeight, int bRepaint)" )  
::SetWindowPos = u.api(
"SetWindowPos","boolean(int hWnd,int hWndlnsertAfter,int X,int Y,int cx,int cy,int Flags)")

//消息 API
::RegisterWindowMessage = u.api("RegisterWindowMessageA","int(string)");
::PostMessage = u.api(
"PostMessageA","int(int hWnd,INT msg,int wParam,int lParam)")
::PostThreadMessage = u.api(
"PostThreadMessageA","int(int idThread,INT msg,int wParam,int lParam)"); 
::SendMessage = u.api(
"SendMessageA","int(int hWnd,INT msg,pointer wParam,pointer lParam)")
::SendMessageInt = u.api(
"SendMessageA","int(int hWnd,INT msg,int wParam,int lParam)")
::SendMessageRefInt = u.api(
"SendMessageA","int(int hWnd,INT msg,int &wParam,int &lParam)")
::SendMessageByString = u.api(
"SendMessageA","int(int,INT,int,string &bin)")
::SendMessageByStr = u.api(
"SendMessageA","int(int,INT,int,str &text)")
::SendMessageByStruct = u.api(
"SendMessageA","int(int,INT,int,struct &)"
::SendMessageTimeout = u.api(
"SendMessageTimeout","int(int hwnd,INT Msg,int wParam,int IParam,INT fuFlags,INT uTimeout,int & lpdwResultult)"
 
 
//图像 API
::LoadImage = u.api(  "LoadImage""ptr(ptr,string,INT uType,int cxDesired,int CyDesire,INT fuLoad)"
::CopyImage = u.api(  
"CopyImage""ptr(ptr handle, INT uType,int cx,int cy,INT flags)"
::LoadBitmap = u.api(  
"LoadBitmap""ptr(ptr,string)")  
::LoadIcon = u.api(  
"LoadIconA""ptr(ptr,string)")      

//内存 API
::GlobalAlloc = k.api("GlobalAlloc","pointer(INT,INT)" ) ;
::GlobalLock = k.api(
"GlobalLock","ponter(pointer)" ) ;
::GlobalUnlock = k.api(
"GlobalUnlock","ponter(pointer)" ) 
::CopyMemory = k.api(
"RtlMoveMemory","int(POINTER Destination,pointer Source,int size)" ) ;
::CopyMemoryByStruct = k.api(
"RtlMoveMemory","int(POINTER Destination,struct Source,int size)" ) ;
::GlobalFree = k.api(
"GlobalFree","void(pointer)" )


/*end intellisense*/

//封装函数
//----------------------------------------------

namespace win

//windows回调函数
CALLBACK = {  
 
/*intellisense(win.CALLBACK)*/
WNDPROC =
"int32(int32 hwnd,INT32,int32,int32)";
DLGPROC =
"int32(int32 hwnd,INT32,int32,int32)";
TIMERPROC =
"void(int32 hwnd,INT32,INT32,INT32)";
GRAYSTRINGPROC =
"int32(ptr,int32,int32)";
WNDENUMPROC =
"int32(int32 hwnd,int32 lParam)";
HOOKPROC =
"int32(int32,int32 wParam,int32 lParam)";
SENDASYNCPROC =
"void(int32,INT32,INT32,int32)";
PROPENUMPROCA =
"int32(int32,string,ptr)";
PROPENUMPROCW =
"int32(int32,string,ptr)";
PROPENUMPROCEX =
"int32(int32,string,ptr,INT32)";
EDITWORDBREAKPROC =
"int32(string lpch,int32 ichCurrent,int32 cch,int32 code)";
DRAWSTATEPROC =
"int32(ptr,int32,int32,int32,int32)"
/*end intellisense*/


/*intellisense(win)*/
GetWindow = u.api( 
"GetWindow""int( int hWnd,INT uCmd)" )
/*end intellisense*/

//样式
getStyle = function(hwnd,style=~0){
    
return ::GetWindowLong(hwnd,0xFFFFFFF0/*_GWL_STYLE*/) & style
}
getStyleEx = 
function(hwnd,style=~0){
    
return ::GetWindowLong(hwnd,0xFFFFFFEC/*_GWL_EXSTYLE*/) & style

modifyStyle = 
function(hwnd,remove=0,add=0,flags,gwl=0xFFFFFFF0/*_GWL_STYLE*/ ){
    
var style = ( ::GetWindowLong(hwnd,gwl) & ~remove ) | add ; 
    ::SetWindowLong(hwnd,gwl,style )
    
if(flags!==null)
        ::SetWindowPos(hwnd,0,0,0,0,0,flags | 0x1
/*_SWP_NOSIZE*/ | 0x2/*_SWP_NOMOVE*/ | 0x4/*_SWP_NOZORDER*/ | 0x10/*_SWP_NOACTIVATE*/)
    
return style
}
modifyStyleEx = 
function(hwnd,remove,add,flags){
    
return modifyStyle( hwnd,remove,add,flags,0xFFFFFFEC/*_GWL_EXSTYLE*/)
}

getParent = u.api( 
"GetParent""int(int hwnd)" )   
setParent = u.api(
"SetParent","int(int hWndChild,int hWndNewParent)");

//获取设置窗口文本
getText = function(hwnd,len){
    
//返回窗体文本
    len := ::SendMessage(hwnd,0xE/*_WM_GETTEXTLENGTH*/,null,null) + 1; 
    
var re, textBuf = ::SendMessageByStr(hwnd,0xD/*_WM_GETTEXT*/,len,len);  
    
return textBuf;  
}
setText = u.api( 
"SetWindowText""INT(int hwnd,string lpString )" ) 

//根据控件ID读取或设置文本
var getDlgItemText = u.api( "GetDlgItemTextA""INT(int hDlg,int nIDDlgItem, str& lpString, int cchMax)" )  
getTextById = 
function(hwnd,id,len=256){  
    
var re, textBuf = getDlgItemText(hwnd,id,len,len);
    
return textBuf ;  
}
setTextById = u.api( 
"SetDlgItemTextA""INT(int hDlg,int nIDDlgItem, string lpString )" )  
  
//返回窗口ID
getId = function(hwnd){ 
    
return ::GetWindowLong(hwnd,0xFFFFFFF4/*_GWL_ID*/ )
}

//返回窗口类名
var getClassName = u.api( "GetClassNameA""int( int hWnd,str  &lpClassName,int nMaxCount )" )  
getClass = 
function(hwnd){
    
var re,classname = getClassName(hwnd,0x64 ,0x64/*_MAX_CLASS*/); 
    
return classname ;
}
 
//返回顶层窗口句柄
getRoot = function(hwnd){ 

    
var result;
    
do{
        result = hwnd;
        hwnd = getParent(hwnd)
    }
while(hwnd) 
    
    
return result; 



getLeaf = 
function(hwnd){
    
var result;
    
do{
        result = hwnd;
        hwnd = GetWindow(hwnd,0x5
/*_GW_CHILD*/)
    }
while(hwnd) 
    
    
return result;
}
getChild = 
function(hwnd){
    
return GetWindow(hwnd,0x5/*_GW_CHILD*/);
}


var getThreadProcessId_c = u.api( "GetWindowThreadProcessId""INT(int hWnd,INT & lpdwProcessId)" ) ;
getThreadProcessId = 
function(hwnd){ 
    
return getThreadProcessId_c(hwnd,0);
}

var getEnvironmentVariable = k.api( "GetEnvironmentVariableA""INT(string lpName,string &lpBuffer,INT nSize)");
var setEnvironmentVariable = k.api( "SetEnvironmentVariableA""INT(string lpName,string  lpValue )"); 
getenv = 
function( name){ //读取环境变量
    var len,val =  getEnvironmentVariable(name, 256,256);
    
if (len > 256)
        len,val =  getEnvironmentVariable(name, len,len); 
    
return val;
}
setenv = 
function( name,val){ //设置环境变量
    return setEnvironmentVariable(name, val);
}

//win.lasterr已废弃,请使用全局函数 ..lasterr
self.lasterr  = ..lasterr

/**intellisense(win)
getStyle(__/*输入窗口句柄*/) = 获取窗口样式
getStyle(__/*输入窗口句柄*/,0) = 获取指定窗口样式\n返回值非零并与指定样式相同、则窗口具有指定样式
getStyleEx(__/*输入窗口句柄*/) = 获取窗口扩展样式
getStyleEx(__/*输入窗口句柄*/,0) = 获取指定窗口扩展样式\n返回值非零并与指定样式相同、则窗口具有指定样式
modifyStyle(.(窗口句柄,移除样式,添加样式) = 如果指定第三个参数,则使用此参数调用::SetWidnowPos 
modifyStyleEx(.(窗口句柄,移除样式,添加样式) = 如果指定第三个参数,则使用此参数调用::SetWidnowPos
getClass(__/*输入窗口句柄*/) = 获取窗口类名
getId(__/*输入窗口句柄*/) = 获取控件ID
getRoot(__/*输入窗口句柄*/) = 获取顶层窗口句柄
getLeaf(__/*输入窗口句柄*/) = 窗口的最梢节子窗口(没有子窗口的控件窗口)
getRoot(__/*输入窗口句柄*/) = 获取顶层窗口句柄
getParent(__/*输入窗口句柄*/) = 获取父窗口句柄
setParent(.(子窗口句柄,父窗口句柄)=设置父窗口
getChild(__/*输入窗口句柄*/) = 获取子窗口句柄 
getText(__/*输入窗口句柄*/,20) = 获取窗口文本,并指定缓冲区大小
getText(__/*输入窗口句柄*/) = 获取窗口文本
setText(.(hwnd,lpString) = 参数(窗口句柄,要设置的文本)
getThreadProcessId(__/*输入窗口句柄*/) = 返回线程ID,进程ID\nvar tid,pid=win.getThreadProcessId(hwnd)
getTextById(.(hwnd,id,len=256) = 获取窗口上控件的文本\n参数(窗口句柄,控件ID,缓冲区大小)
setTextById(.(hwnd,id,str) = 设置窗口上控件的文本\n参数(窗口句柄,控件ID,文本)
getenv("__") = 读取环璋变量
setenv("__","") = 设置环境变量
lasterr() = win.lasterr已废弃,请使用全局函数 ..lasterr
end intellisense**/

   
//窗口查找
getDesktop = u.api( "GetDesktopWindow""int()" ) 
setTop = u.api(
"BringWindowToTop","boolean(int hWnd)")  
getActive = u.api(
"GetActiveWindow","int()"
setActive = u.api(
"SetActiveWindow","int(int hwnd)"
getFocus = u.api(
"GetFocus","int()");
setFocus = u.api(
"SetFocus","int(int hwnd)");
enable = u.api(
"EnableWindow","int(int hwnd,bool enable)"
close = 
function(hwnd){ 
    ::SendMessage(hwnd,0x10
/*_WM_CLOSE*/);

var showWindow = u.api( "ShowWindow""int(int,int)" )  
show = 
function(hwnd,flag=true) {   
    showWindow( hwnd,flag===
true ? 0x5/*_SW_SHOW*/ : tonumber(flag) ); 
}
findEx = u.api( 
"FindWindowExA""int(int hWndParent,int hWndChildAfter,string lpszClass,string lpszWindow)" )  
find = u.api( 
"FindWindowA""int( string lpszClass,string lpszWindow)" ) 

setTopmost = 
function(hwnd,top=true){
     ::SetWindowPos(hwnd,(top)?-1
/*_HWND_TOPMOST*/:-2/*_HWND_NOTOPMOST*/,0,0,0,0,0x2/*_SWP_NOMOVE*/|0x1/*_SWP_NOSIZE*/


//try{
    SwitchToThisWindow = u.api( "SwitchToThisWindow""int(int hwnd,int bRestore)" )  
    setForeground = 
function(hwnd,restore=1){
        
return SwitchToThisWindow(hwnd,restore);
    }   
/*
}
catch(e){
    setForeground = u.api("SetForegroundWindow","int(int hwnd)") 

*/

getForeground = u.api( 
"GetForegroundWindow""int()" )
        
isVisible = u.api(
"IsWindowVisible","int(int hwnd)")
isWindow = u.api( 
"IsWindow""int(int hwnd)" )    
isIconic = u.api( 
"IsIconic""int(int hwnd)" )  
isZoomed = u.api(
"IsZoomed","int(int hwnd)")    
isEnable = 
function(hwnd){
    
return ! getStyle(hwnd,0x8000000/*_WS_DISABLED*/ )

isChild = ::User32.api(
"IsChild","int(int parent,int hwnd)")

/**intellisense(win)   
isChild(.(父窗口句柄,子窗口句柄) = 判断参数二指定的窗口是否参数一指定窗口的子窗口或隶属子窗口
isVisible(__/*输入窗口句柄*/) = 判断窗口是否可见
isWindow(__/*输入窗口句柄*/) = 判断是否有效窗口
isIconic(__/*输入窗口句柄*/) = 判断窗口是否最小化为任务栏图标
isZoomed(__/*输入窗口句柄*/) = 判断窗口是否最大化
isEnable(__/*输入窗口句柄*/) = 判断窗口是否启用状态
show(hwnd,__/*可选输入显示参数*/) = 显示窗口,可选输入以_SW_为前缀的显示参数
show(hwnd,false) = 隐藏窗口
close(__/*输入窗口句柄*/) = 关闭窗口
enable(__/*输入窗口句柄*/,true) = 启用窗口
enable(__/*输入窗口句柄*/,false) = 禁用窗口
setTop(__/*输入窗口句柄*/)=前置窗口到当前线程Z序顶部
setForeground(__/*输入窗口句柄*/)=前置窗口
getForeground()=获取前台窗口句柄
getActive()=获取当前线程激活窗口句柄,如果要获取全局激活窗口请使用win.getForeground()
setActive(__/*输入窗口句柄*/)=设置激活窗口
getFocus()=获取窗入焦点所在窗口句柄
setFocus(__/*输入窗口句柄*/)=设置输入焦点
getDesktop()=获取桌面句柄
setTopmost(__/*输入窗口句柄*/)=置顶窗口
setTopmost(__/*输入窗口句柄*/,false)=取消置顶窗口
find(.(类名,标题)=查找顶层窗口,参数都是可选参数
findEx(.(父窗口句柄,上一个窗口句柄,类名,标题)=查找子窗口\n除父窗口句柄以外,其他参数都是可选参数 
end intellisense**/
 


setPos = 
function(hwnd,x,y,cx,cy,after,flag=0){
    
if( (x===null) || (y===null) ){
       flag |= 0x2
/*_SWP_NOMOVE*/
       x,y = 0,0;
    }
       
    
if( (cx===null) || (cy===null) ){
       flag |= 0x1
/*_SWP_NOSIZE*/
       cx,cy = 0,0;
    }
      
    
if( after === null ){
       flag |= 0x4
/*_SWP_NOZORDER*/
       after = 0;
    } 
    SetWindowPos(hwnd,after,x,y,cx,cy,flag);
}

//ptConv不得传出外部
var ptConv = POINT();
toScreen = 
function(hwnd,x,y){
    ptConv.x = x;
    ptConv.y = y;
    ClientToScreen(hwnd,ptConv);
    
return ptConv.x,ptConv.y;
}
toClient = 
function(hwnd,x,y){
    ptConv.x = x;
    ptConv.y = y;
    ScreenToClient(hwnd,ptConv);
    
return ptConv.x,ptConv.y;
}
var converRect = function(conv,parent,rc){
    ptConv.x = rc.right; 
    ptConv.y = rc.bottom;
    conv( parent,rc );
    conv( parent,ptConv );
    rc.right = ptConv.x;
    rc.bottom = ptConv.y;
    
return rc;
}
toScreenRect = 
function(parent,rc){
    
return converRect( ClientToScreen,parent,rc );
}
toClientRect = 
function(parent,rc){
    
return converRect( ScreenToClient,parent,rc );
}

//返回窗口的相对坐标 
getRect  = function(hwnd,scr){  
    
var rc = RECT();
    GetWindowRect( hwnd,rc); 
    
if( scr ) 
        
return rc;
      
    
var parent = ..win.getParent(hwnd)
    
if( parent ) 
        toClientRect( parent,rc ); 
     
    
return rc; 
}
getClientRect = 
function(hwnd){
    
var rc = RECT();
    GetClientRect( hwnd,rc); 
    
return rc;
}
setRect = 
function(hwnd,rc){
    setPos(hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top)
}
getPos = 
function(hwnd,scr){
    
var rc = getRect(hwnd,scr);
    
return rc.left, rc.top, rc.right - rc.left ,rc.bottom - rc.top 
}


/**intellisense()
?.getRect = !rect.
!rect.left = 左
!rect.top = 上
!rect.right = 右
!rect.bottom = 下
!point.x = x坐标
!point.y = y坐标
?::RECT = !rect.
?::RECT = !point.
end intellisense**/


/**intellisense(win)
toScreen(__/*输入窗口句柄*/,x,y) = 将坐标转换为屏幕坐标\n::POINT结构体请直接使用::ClientToScreen
toClient(__/*输入窗口句柄*/,x,y) = 将坐标转换为客户坐标\n::POINT结构体请直接使用::ScreenToClient
toScreenRect(__/*输入窗口句柄*/,rc) = 将::RECT结构体转换为屏幕坐标
toClientRect(__/*输入窗口句柄*/,rc) = 将::RECT结构体转换为客户坐标
getRect(__/*输入窗口句柄*/) = 返回窗体相对坐标位置\n对于顶层窗口则等同于屏幕绝对坐标位置\n如需返回屏幕坐标,可以直接使用 ::GetWindowRect
getRect(__/*输入窗口句柄*/,true) = 返回窗体屏幕坐标位置\n返回值为::RECT结构体
setRect(__/*输入窗口句柄*/,rc) = 设置窗口相对坐标位置
getClientRect(__/*输入窗口句柄*/) = 获取窗口客户区的坐标\n不包括边框等
setPos(.(窗口句柄,x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,除句柄外所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置(句柄或_HWND前缀常量)则调整Z序
getPos(__/*输入窗口句柄*/) = 返回相对坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd)
getPos(__/*输入窗口句柄*/,true) = 返回屏幕坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd)
end intellisense**/


getScreen = 
function(){ 
    
return ::GetSystemMetrics( 0x0 ),::GetSystemMetrics( 0x1 )
}  
/**intellisense(win)
getScreen() = 返回屏幕宽度、高度
end intellisense**/

 
 
var messageBox = u.api( "MessageBoxA"" int ( int hWnd, string lpText,string lpCaption ,INT uType )" )  
var messageBoxTimeout = u.api("MessageBoxTimeoutA","int(int hwnd,string lpText,string lpCaption,int uType,int wlange,int dwTimeout)","stdcall") ;

msgbox = 
function(str,title = "AAuto" ,style ,parenthwnd=0 ){ 
   style := 0x40 
// _MB_OK|_MB_ICONINFORMATION;
    
   
if(!parenthwnd)
        style |= 0x2000
/*_MB_TASKMODAL*/
        
   
return  messageBox( parenthwnd,tostring( str ) ,title,style | 0x10000/*_MB_SETFOREGROUND*/ );
}
msgboxTest = 
function(str,title ,parenthwnd=0){
    
return msgbox(str,title,0x1 | 0x20 /*_MB_OKCANCEL|_MB_ICONQUESTION*/ ,parenthwnd ) == 1;    
}
msgboxTimeout = 
function(str,title = "AAuto" ,timeout =2000,style ,parenthwnd=0 ){
    style := 0x40 
// _MB_OK|_MB_ICONINFORMATION;
    if(!parenthwnd)
        style |= 0x2000
/*_MB_TASKMODAL*/
    
return  messageBoxTimeout( parenthwnd,tostring( str ) ,title,style | 0x10000/*_MB_SETFOREGROUND*/ ,0,timeout );
}
  
/*消息循环函数{{*/ 

    
/*
    ::TranslateAccelerator = u.api("TranslateAcceleratorA","int(int hWnd,int hAccTable,struct  lpMsg)");
    ::CreateAcceleratorTable = u.api("CreateAcceleratorTableA","int(struct paccel,  int cAccel)");
    
    class ACCEL { 
        ctor(v,k,c){
        this.fVirt = v;this.key=k;this.cmd=c ;
        }
        WORD   fVirt;  
        WORD   key;
        INT  cmd; 
    }  
    */
 
    isDialogMessage  = u.api(
"IsDialogMessage","INT(int hDlg,struct IpMsgc)");
    
var isDialogMessage = isDialogMessage;
    
    
var peekMessage = u.api(  "PeekMessage""int(struct& lpMsg,int hwnd,INT wMsgFilterMin,INT wMsgFilterMax,INT wRemoveMsg)")   
    
var getMessage = u.api( "GetMessage"" int(struct&,int,INT,INT) " )   
    
var translateMessage = u.api( "TranslateMessage"" int(struct&) " )   
    
var dispatchMessage = u.api( "DispatchMessage"" int(struct&) " )  
    
    
var mapforms = { //键为控件名任意窗口句柄,值为容器form
        @{ _weak = "kv"}  //在元表中指定为弱引用,以自动清除不使用的元素
    }

    
var msg_observer = {}
    
var parseMessage = function(msg){
            
if( msg_observer[[1]] ){
                
for(k,v in msg_observer){
                    
var re = v(msg);
                    
if(  re !==null){ 
                        
return re;
                    }
                }
                
            }
            
            
var hwnd = msg.hwnd; 
            
if( hwnd &&  ..win.ui ){
                
var winform  = mapforms[hwnd] 
                
if(  winform === null  ){
                    winform = ..win.ui.getForm(hwnd)
                    
                    
if(!winform)
                        mapforms[hwnd] = 
false//标记为false,避免重复查询父窗口
                    else 
                        mapforms[hwnd] = winform; 
                     
                }
                
                
if( winform  ){   
                    
if(winform.pretranslate && winform.pretranslate(msg) )
                        
return true;
                        
                    
if( (msg.message >= 0x100/*_WM_KEYFIRST*/) && (msg.message <= 0x108/*_WM_KEYLAST*/) ){ 
                        
var isdlg = winform[["isDialogMessage"]] : isDialogMessage;  
                        
if( isdlg( winform.hwnd,msg ) )
                            
return true;
                    } 
                }
    
            }
            
            translateMessage( msg); 
            dispatchMessage( msg); 
            
    }
    
        
    
var msgloop;
        
    pumpMessage = 
function(){
        
var msg = ::MSG();
        
if( getMessage( msg,0,0,0) > 0 )
        {
            
if(msg.message == 0x12 ){
                quitMessage(); 
                
return null;
            }
            
            parseMessage(msg);
        }
        
sleep(1)
    }
    
    
/*
        启动消息循环,即使重复调用此函数,一个线程仅启动一个循环。
        
        参数:
        observer 消息观察函数,可以为null
        attach 为true则注册observer函数,为false则注销observer函数  
    */

    loopMessage = 
function( observer ,attach=true){ //启动消息循环,参数为主窗体   
        if(type(observer) == type.function ){
            
if( !attach ){
                
for(i=#msg_observer;1){
                    
if( msg_observer[i] == observer){
                        ..table.remove(msg_observer,i);
                        
return true;
                    }
                }
                
return false;
            }
            ..table.push(msg_observer,observer);
        }
        
        
//排重
        if(msgloop)return;
        msgloop = 
true;
        
        ..win.closed = 
null;
        
        
var msg = ::MSG();
        
while(   getMessage( msg,0,0,0) > 0    ) //GetMessage()函数会返回0,非0和-1。其中-1表示由于hWnd不是有效   的窗口句柄等原因而出错。 
        {    
            parseMessage(msg); 
    
        }
        
        msgloop = 
false;
        ..win.closed = 
true;
        mapforms = {};
//清空缓存里的所有窗口对象
        
        
return  true
    }
    
    quitMessage = 
function(){
    ::PostThreadMessage(..thread.getId(),0x12
/*_WM_QUIT*/ ,0,0);
    ..win.closed = 
true;  
    }
        
    
    
var time_tick = ..time.tick;
    delay = 
function ( nTimeMs = 0 ) { 
        
var msg = ::MSG();
        
var endTick = time_tick() + nTimeMs;
        
while(time_tick() < endTick)  
        {  
            
if( closed )return false;
            
            
if(peekMessage(msg , 0, 0, 0, 1)) {
                
if(msg.message == 0x12 ){
                    quitMessage();
                    
return false;
                }
                
                parseMessage(msg);
            }
            
sleep(1)
        }
        
return true;
    }
    
/*}}*/
 

/**intellisense(win) 
msgbox("__","AAuto") = 弹出对话框
msgboxTimeout("__","标题") = 弹出对话框,超时自动关闭
msgboxTimeout("__","标题",3000) = 弹出对话框,超时自动关闭
msgboxTest("",""); = @win.msgboxTest("询问用户的信息","标题")//返回布尔值表示用户是否按了“确定”按钮。 
closed = 用户是否关闭了全部窗口 
loopMessage(__) = 运行消息循环
quitMessage() = 退出消息循环
pumpMessage() = 处理消息
isDialogMessage(hwnd,msg) = 处理对话框控制键消息
delay(__) = 延时n毫秒\n如果不需要消息循环时,建议使用sleep函数
end intellisense**/

阅读(1551) | 评论(0) | 转发(0) |
0

上一篇:WIN-UI库源码

下一篇:倒计时的代码

给主人留下些什么吧!~~