//RUNAS//列表视图(listview)控件范例 - UWP本机隔离 import win.ui; import win.ui.menu; import fonts.fontAwesome; /*DSG{{*/ var winform = win.form(text="UWP 应用 - 本机网络隔离工具";right=1150;bottom=666;bgcolor=16777215) winform.add( btnAllowLocalhostLoopback={cls="plus";text='\uF13E 允许所有应用';left=678;top=625;right=873;bottom=661;bgcolor=14609886;db=1;dr=1;font=LOGFONT(h=-16;name='FontAwesome');notify=1;tabstop=1;z=5}; btnDisableLocalhostLoopback={cls="plus";text='\uF023 禁止所有应用';left=886;top=625;right=1081;bottom=661;bgcolor=14147583;db=1;dr=1;font=LOGFONT(h=-16;name='FontAwesome');notify=1;tabstop=1;z=6}; listview={cls="listview";left=8;top=41;right=1138;bottom=617;acceptfiles=1;asel=false;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(name='SimSun');fullRow=1;gridLines=1;hide=1;vscroll=1;z=1}; openMicrosoftStore={cls="plus";text="打开应用商店";left=528;top=627;right=664;bottom=659;color=8388608;db=1;dr=1;notify=1;textPadding={left=5};z=7}; plusLoading={cls="plus";left=368;top=195;right=739;bottom=457;color=15780518;db=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-96;name='FontAwesome');iconStyle={font=LOGFONT(h=-96;name='FontAwesome')};iconText='\uF254';z=2}; plusSearch={cls="plus";left=727;top=3;right=1136;bottom=33;align="right";autohscroll=false;autovscroll=false;border={bottom=1;color=-4144960};dr=1;dt=1;editable=1;font=LOGFONT(h=-13);hide=1;textPadding={top=10;bottom=3};valign="top";z=3}; tip={cls="static";text="单击列标题可排序,双击列表项可复制,右键点列表项可弹出菜单,回车搜索或刷新";left=13;top=626;right=528;bottom=655;db=1;dl=1;dr=1;transparent=1;z=4} ) /*}}*/ uiLanguage = { displayName = "显示名称"; packageName = "完整包名"; localhost = "本机"; enabled = "允许"; disabled = "禁止"; searchCueBannerText = "输入应用名(支持模式匹配)"; exemptAll = '\uF13E 允许所有应用'; exemptNone = '\uF023 禁止所有应用'; allowLocalhostLoopback = "允许访问本机网络"; disableLocalhostLoopback = "禁止访问本机网络"; requiredWin10 = "本程序仅支持 WIN10"; run = "启动应用"; tip = "单击列标题可排序,双击列表项可复制,右键点列表项可弹出菜单,回车搜索或刷新"; title = "UWP 应用 - 本机网络隔离工具"; openMicrosoftStore = "打开应用商店"; } import win.ui.grid; var grid = win.ui.grid(winform.listview); var reloadItemData = function(){ thread.invoke( function(uiLanguage,winform,grid){ winform.plusLoading.hide = false; winform.plusSearch.hide = true; winform.listview.hide = true; winform.plusLoading.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'} import sys.networkIsolation; var dataTable = sys.networkIsolation.getAppContainers(); var word = string.trim(winform.plusSearch.text); if(#word){ word = "@@" + word; dataTable = table.filter(dataTable ,lambda(v) string.find(v.displayName,word) || string.find(v.appContainerName,word)|| string.find(v.description,word) ) } for(k,app in dataTable){ app.loopback = app.loopback?uiLanguage.enabled:uiLanguage.disabled; } dataTable.fields = {"displayName","appContainerName","loopback","sid"} if(grid.sortColumn){ var name = dataTable.fields[grid.sortColumn]; if(name){ if(!grid.sortDesc){ table.sort(dataTable,function(b){ return owner[name] < b[name] }) } else { table.sort(dataTable,function(b){ return owner[name] > b[name] }) } } } grid.setTable( dataTable ) sleep(300); winform.plusLoading.disabledText = null; winform.plusLoading.hide = true; winform.listview.hide = false; winform.plusSearch.hide = false; winform.resize(); },uiLanguage,winform,grid ) } grid.onSortColumn = function(column,desc){ grid.sortDesc = desc; grid.sortColumn = column ; reloadItemData(); return true; } grid.onEditChanged = function(text,iItem,iSubItem){ return false; //禁止编辑 } winform.adjust = function( cx,cy,wParam ) { winform.listview.fillParent(); }; import win.debounce; winform.plusSearch.editBox.onChange = win.debounce(function(){ if(#winform.plusSearch.text) reloadItemData(); }) import sys.networkIsolation var exemptUwpApp = function(exempted){ var sidConfigs = {}; for item,sid in winform.listview.eachSelected(4){ sidConfigs[sid] = exempted; } sys.networkIsolation.enableLoopback(sidConfigs); var exemptApps = sys.networkIsolation.getLoopbackState(); for item,sid in winform.listview.eachSelected(4){ winform.listview.setItemText( exemptApps[sid]?uiLanguage.enabled:uiLanguage.disabled,item,3); } } import com.shell; winform.listview.onnotify = function(id,code,ptr){ select(code) { case 0xFFFFFFFB/*_NM_RCLICK*/ { var x,y = win.getCursorPos(); winform.popmenu = win.ui.popmenu(winform); if(1===#winform.listview.selected){ var item,path = winform.listview.getSelection(,2); winform.popmenu.add(uiLanguage.run,function(id){ import com.shell; com.shell.activateApp(path); }); } winform.popmenu.add(uiLanguage.allowLocalhostLoopback,function(id){ exemptUwpApp(true); }); winform.popmenu.add(uiLanguage.disableLocalhostLoopback,function(id){ exemptUwpApp(false); }); winform.popmenu.popup(x,y,true); } } } winform.btnAllowLocalhostLoopback.skin({ background={ default=0x669BCC9B; hover=0xFF928BB3; disabled=0xFFCCCCCC; } }) winform.btnAllowLocalhostLoopback.oncommand = function(id,event){ var sidConfigs = {}; for item,sid in winform.listview.each(0,0,4){ sidConfigs[sid] = true; } sys.networkIsolation.enableLoopback(sidConfigs); reloadItemData(); } winform.btnDisableLocalhostLoopback.skin({ background={ default=0x66FFA07D; hover=0xFF928BB3; disabled=0xFFCCCCCC; } }) winform.btnDisableLocalhostLoopback.oncommand = function(id,event){ var sidConfigs = {}; for item,sid in winform.listview.each(0,0,4){ sidConfigs[sid] = false; } sys.networkIsolation.enableLoopback(sidConfigs); reloadItemData(); } winform.onOk = function(){ winform.plusSearch.setFocus() } winform.plusSearch.setCueBannerText(uiLanguage.searchCueBannerText); winform.listview.setExtended(0x10000/*_LVS_EX_DOUBLEBUFFER*/); var setUiLanguage = function(lang){ uiLanguage = lang; winform.text = uiLanguage.title; winform.btnAllowLocalhostLoopback.text = uiLanguage.exemptAll; winform.btnDisableLocalhostLoopback.text = uiLanguage.exemptNone; winform.tip.text = uiLanguage.tip; winform.openMicrosoftStore.text = uiLanguage.openMicrosoftStore; winform.listview.clear(true); winform.listview.insertColumn(uiLanguage.displayName,300) winform.listview.insertColumn(uiLanguage.packageName,300) winform.listview.insertColumn(uiLanguage.localhost,80) winform.listview.insertColumn("SID",-2) winform.plusSearch.setCueBannerText(uiLanguage.searchCueBannerText) } var lcid = ::Kernel32.GetUserDefaultLCID() if( lcid==1028 || lcid == 3076 || lcid == 5124 ){ import string.conv; setUiLanguage(table.map(uiLanguage,lambda(v) string.conv.traditionalized(v)) ) } elseif( lcid!=2052 ){ setUiLanguage({ displayName = "DisplayName"; packageName = "Package"; localhost = "Localhost"; enabled = "enabled"; disabled = "disabled"; searchCueBannerText = "Search"; exemptAll = '\uF13E Exempt All'; exemptNone = '\uF023 Exempt None'; allowLocalhostLoopback = "Allow Localhost Loopback"; disableLocalhostLoopback = "Disable Localhost Loopback"; requiredWin10 = "This software only supports Windows 10"; run = "Run"; tip = "Sort by clicking on headers, double-click to copy, enter to searh or refresh."; title = "UWP Loopback Exemption Utility"; openMicrosoftStore = "Open Microsoft Store"; }) } else { setUiLanguage(uiLanguage); } reloadItemData(); winform.plusSearch.editBox.onOk = function(){ reloadItemData(); return true; } winform.show(); import win.dlg.message; if(!_WIN10_LATER){ winform.msgWarn(uiLanguage.requiredWin10) } winform.openMicrosoftStore.skin({ color={ active=0xFF00FF00; default=0xFF000080; disabled=0xFF6D6D6D; hover=0xFFFF0000 } }) winform.openMicrosoftStore.oncommand = function(id,event){ //打开应用商店,且修复 ms-windows-store:// 协议 com.shell.activateApp("Microsoft.WindowsStore_8wekyb3d8bbwe!App"); /* 有时候系统出现问题 ms-windows-store 协议可能用不了,下面的方法就打不开。 但 com.shell.activateApp("Microsoft.WindowsStore_8wekyb3d8bbwe!App") 可以打开。 而且打开一次,ms-windows-store 协议就正常了。 */ //process.execute("ms-windows-store://home") } win.loopMessage();