精华内容
下载资源
问答
  • linux窗口切换快捷键We’ve already shown you how to customize shortcut keys in any Linux application, but for today’s lesson we’ll take it a step beyond—and assign a shortcut key that switches an ...
    linux窗口切换快捷键

    linux窗口切换快捷键

    We’ve already shown you how to customize shortcut keys in any Linux application, but for today’s lesson we’ll take it a step beyond—and assign a shortcut key that switches an open application to be the currently focused window.

    我们已经向您展示了如何在任何Linux应用程序中自定义快捷键 ,但是在今天的课程中,我们将进一步介绍它,并指定将打开的应用程序切换为当前焦点窗口的快捷键。

    The idea is that instead of using the mouse or flipping through a set of windows in the Alt+Tab switcher, you can quickly assign a hotkey to your most important windows and switch to them with a single keystroke, saving yourself a lot of time. To accomplish this task on Linux, we’ll use the excellent AutoKey utility.

    这个想法是,您无需使用鼠标或在Alt + Tab切换器中浏览一组窗口,而是可以将热键快速分配给最重要的窗口,并通过一次按键即可切换到它们,从而节省了很多时间。 为了在Linux上完成此任务,我们将使用出色的AutoKey实用程序。

    Note: if you want the Windows way to do this, you can accomplish the task with AutoHotkey easily.

    注意:如果您希望使用Windows的方式来执行此操作,则可以使用AutoHotkey轻松完成任务

    场景 (The Scenario)

    Since I do most of my work in Google Chrome, I need to have it accessible as quickly as possible and I generally assign the Alt+G key combination to switch to my open Chrome window.

    由于我的大部分工作都是在Google Chrome浏览器中完成的,因此我需要尽快对其进行访问,并且通常会分配Alt + G组合键切换到打开的Chrome窗口。

    image

    安装自动密钥 (Installing AutoKey)

    You’ll want to open up the Synaptic Package Manager and do a quick search for autokey, check the box, and then install the package. You could also install it using the apt-get command like this:

    您将要打开Synaptic软件包管理器并快速搜索autokey ,选中该复选框,然后安装该软件包。 您也可以使用apt-get命令安装它,如下所示:

    sudo apt-get install autokey

    sudo apt-get install autokey

    image5

    将快捷键分配给应用程序窗口 (Assigning a Shortcut Key to an Application Window)

    Open up the AutoKey configuration screen from the system tray icon, and then create a New Script from the menu, and then paste in the following code:

    从系统任务栏图标打开“自动键配置”屏幕,然后从菜单中创建“新脚本”,然后粘贴以下代码:

    window.activate(‘Google Chrome’)

    window.activate('Google Chrome')

    You’ll want to use the Set button next to the Hotkey setting, and assign your preferred hotkey—mine is Alt+G, though you’ll want to make sure that you use a lowercase g while setting the hotkey—if you set it using an uppercase letter it won’t behave right.

    您将要使用“热键”设置旁边的“设置”按钮,并分配您首选的热键(我的是Alt + G,尽管要确保在设置热键时使用小写的g)(如果设置了该键)使用大写字母将无法正常工作。

    image

    Once you save the setting and minimize or close the AutoKey configuration screen, you can hit the Alt+G shortcut key combination anytime you want to switch to the open window.

    保存设置并最小化或关闭“自动键”配置屏幕后,您随时可以切换到打开的窗口,按Alt + G快捷键组合。

    这是如何运作的? (How Does This Work?)

    When you hit the shortcut key that you’ve assigned, AutoKey will run the script that you’ve added—in this case, it’s a simple Python script that uses the wmctrl functions to control open windows. Here’s the syntax for the window.activate function, which switches the specified window to be the active window:

    当您按下分配的快捷键时,AutoKey将运行您添加的脚本-在这种情况下,这是一个简单的Python脚本,使用wmctrl函数控制打开的窗口。 这是window.activate函数的语法,该函数将指定的窗口切换为活动窗口:

    window.activate(‘partial window title here’)

    window.activate('部分窗口标题在这里')

    Basically all you need to do is match part of the window title, and in the case of Google Chrome, the window title always has “- Google Chrome” at the end.

    基本上,您需要做的就是匹配窗口标题的一部分,对于Google Chrome,窗口标题的末尾总是带有“-Google Chrome”。

    翻译自: https://www.howtogeek.com/howto/26937/assign-a-shortcut-key-to-activate-an-open-application-window-on-linux/

    linux窗口切换快捷键

    展开全文
  • win32gui用于关闭窗口程序(显示最大化最小化) Python调用(运行)外部程序 2019/3/7 在Python中可在脚本中直接使用其他脚本或程序 1 使用os.system(command)运行其他程序 : 参数 command 要执行的命令,...

    说明:前面的部分用于打开外部程序.exe;win32gui用于关闭窗口程序(显示最大化最小化)

    Python调用(运行)外部程序  2019/3/7

     

    在Python中可在脚本中直接使用其他脚本或程序

    1 使用os.system(command)运行其他程序

    参数
    
    command 要执行的命令,相当于在Windows的cmd窗口中输入的命令。
    如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。

    实例:

    import os,sys
    
    os.system('notepad')          # 使用os.system()函数打开记事本程序
    os.system('notepad python.txt')# 向记事本传递参数,打开python.txt文件
    os.system('start "" /d  "C:\\Users\\Administrator\\AppData\\Roaming\\Goldminer3\\"  /wait
              "goldminer3.exe" ''--username=131628911xx --password=xxxx')

    实例1.1:

     def test():
    
         #base_dir=os.path.dirname("C:\\Users\\Administrator\\AppData\\Roaming\\Goldminer3\\")
         #sys.path.append(base_dir)      #临时修改环境变量
         
         currrent_path=os.getcwd()   
         print('1.current_path=',os.getcwd())#D:\PycharmProjects\test_py36
         os.chdir("C:\\Users\\Administrator\\AppData\\Roaming\\Goldminer3\\")#必须
         print('2.current_path=',os.getcwd()) 
        
         # C:\Users\Administrator\AppData\Roaming\Goldminer3
         os.system('goldminer3.exe --username=13162891176 --password=tcy-1974')
         os.chdir(currrent_path) #改变工作目录    
    
      test()

    显示结果:

    1.current_path= D:\PycharmProjects\test_py36
    2.current_path= C:\Users\Administrator\AppData\Roaming\Goldminer3 
          [main 下午1:22:38] updatesetState idle
          [main 下午1:22:38] BackendInit { version: '3.10.0',
            commit: '10706b5ff1e4441304cd410756328c5d43e9b548' }
          ...
          [main 下午1:23:24] Backendquit
    3.current_path= D:\PycharmProjects\test_py36

    2 ShellExecute(hwnd, op , file , params , dir , bShow )相当于在资源管理器中双击文件图标一样

     参数
    
    hwnd:父窗口的句柄,如果没有父窗口,则为0。
    op:  要进行的操作,为“open”、“print”或者为空。
    file:要运行的程序,或者打开的脚本。
    params:要向程序传递的参数,如果打开的为文件,则为空。
    dir:   程序初始化的目录。
    bShow: 是否显示窗口。

    实例2.1:

    import win32api
    
    win32api.ShellExecute(0, 'open', 'notepad.exe', '','',0)#打开记事本后台运行
    
    win32api.ShellExecute(0, 'open', 'notepad.exe', '','',1)#前台运行
    
    win32api.ShellExecute(0, 'open', 'notepad.exe', 'python.txt','',1)# 向记事本传递参数,打开python.txt
    
    win32api.ShellExecute(0, 'open', 'http://www.python.org', '','',1)# 在默认浏览器中打开网站
    
    win32api.ShellExecute(0, 'open', 'E:\\song.wma', '','',1) # 在默认的媒体播放器中播放E:\song.wma
    
    win32api.ShellExecute(0, 'open', 'E:\\book\\code\\MessageBox.py', '','',1)# 运行MessageBox.py脚本
     def test2():
    
        # 打开记事本程序,在后台运行,即显示记事本程序的窗口
    
        win32api.ShellExecute(0, 'open', 'notepad.exe',
    
               r'C:\ProgramData\MySQL\MySQL Server 8.0\my.ini','',1)
    
        win32api.ShellExecute(0, 'open', 'notepad.exe', 'my.ini',
    
               'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\', 1)
    
        win32api.ShellExecute(0, 'open', 'goldminer3.exe', '--username=131628911xx -- password=xx',
    
               'C:\\Users\\Administrator\\AppData\\Roaming\\Goldminer3\\', 1)
    
    test2()

     

    3 CreateProcess(appName, commandLine , processAttributes , threadAttributes ,

    bInheritHandles ,dwCreationFlags , newEnvironment , currentDirectory , startupinfo )

    import win32process,win32event
    handle = win32process.CreateProcess('c:\\windows\\notepad.exe', '',None , None , 0 ,
    win32process. CREATE_NO_WINDOW , None , None ,win32process.STARTUPINFO())
    # 打开记事本获得其句柄
    #(<?XML:NAMESPACE PREFIX = PYHANDLE />, , 280, 3076)
    # 函数返回进程句柄、线程句柄、进程ID,以及线程ID
    win32process.TerminateProcess(handle[0],0) #用TerminateProcess函数终止记事本程序
    win32event.WaitForSingleObject(handle[0], -1)# 等待进程结束0进程结束的返回值
    

     

    4 使用ctypes调用kernel32.dll中的函数

    import win32process,win32event
    
    handle = win32process.CreateProcess('c:\\windows\\notepad.exe', '',None , None , 0 ,
    
    win32process. CREATE_NO_WINDOW , None , None ,win32process.STARTUPINFO())
    
    # 打开记事本获得其句柄
    
    #(<?XML:NAMESPACE PREFIX = PYHANDLE />, , 280, 3076)
    
    # 函数返回进程句柄、线程句柄、进程ID,以及线程ID
    
    win32process.TerminateProcess(handle[0],0) #用TerminateProcess函数终止记事本程序
    
    win32event.WaitForSingleObject(handle[0], -1)# 等待进程结束0进程结束的返回值
    
    from ctypes import *
    
    user32 = windll.LoadLibrary('user32.dll')            # 加载动态链接库
    
    user32.MessageBoxA(0, 'Ctypes is cool!', 'Ctypes', 0)# 调用MessageBoxA函数

    .

    5.os.popen运行dos命令

     print(os.popen('dir').read())

     

    6.subprocess

    import sys,os,subprocess
    from subprocess import Popen,PIPE
    
    
    def test2():# 用subprocess.Popen执行.exe程序
        order_name="goldminer3.exe --username=13162891176 --password=tcy-1974"
        path='C:\\Users\\Administrator\\AppData\\Roaming\\Goldminer3\\'
    
        #cwd指定子进程工作路径
        p=subprocess.Popen(order_name,shell=True,stdout=subprocess.PIPE,cwd=path)#程序阻塞
        s=p.stdout.read()#b"\r\n[main \xe4\xb8\x8b\xe5\x8d\x885:20:25]..."
        s=s.split()
    
        lst=[i.decode() for i in s]
        print(lst)        #['[main', '下午5:23:17]', 'update#setState', 'idle', ...]
    
    # test2()

     

    实例:

     def test3(): # 用subprocess.Popen执行系统命令
    
        p= Popen('cd', shell=True,stdout=subprocess.PIPE)#windows执行cd命令获取当前目录
        print('p=',p.stdout.read())   #b'D:\\PycharmProjects\\test_py36\r\n'
        print(os.popen('cd').read())  # C:\Users\Administrator\AppData\Roaming\Goldminer3
    
        p = Popen('python c:\b.py', shell=True, stdout=PIPE)  # 运行脚本b.py
        p.wait()   # 获取Popen的返回值及输出
        if (p.returncode == 0): print("当前目录:%s" % p2.stdout.read())
    
    #test3()

     

    win32gui

    官网:http://timgolden.me.uk/pywin32-docs/win32gui.html

    实例1:

    import win32gui,win32con,win32api
    import time
    def test_win32gui():
        hwnd = win32gui.FindWindow("TXGuiFoundation", "TIM")#找主窗口
        print('hwnd=%0x'%hwnd,hwnd)#hwnd=a0b42 658242
        Ex_hwnd=win32gui.FindWindowEx(hwnd,None,'Edit',None)
        print('Ex_hwnd=%0x'%Ex_hwnd)#Ex_hwnd=a0af8
        # hhwndChildList = []  # 枚举子窗口
        # win32gui.EnumChildWindows(hwnd, lambda hhwnd, param: param.append(hhwnd),                         
          hhwndChildList)
        # print('hhwndChildList=     ',hhwndChildList) #[789286]
    
        time.sleep(2)
        win32gui.CloseWindow(hwnd)                                                                         
    
        #窗口最小化
        time.sleep(2)
        win32gui.SendMessage(hwnd, win32con.WM_CLOSE)              #关闭窗口
    
    test_win32gui()
    win32gui.方法:
    FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名 

    方法:

    FindWindowEx(hhwndParent=0, hhwndChildAfter=0, lpszClass=None, lpszWindow=None);
    描述:搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。不区分大小写,找不到就返回0。
    参数:
    hhwndParent: 若不为0,则搜索句柄为hhwndParent窗体的子窗体。
    hhwndChildAfter:若不为0,则按照z-index的顺序从hhwndChildAfter向后开始搜索子窗体,
    否则从第一个子窗体开始搜索。
    lpClassName: 字符型,是窗体的类名,这个可以在Spy++里找到。
    lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
    说明:找到了主窗口以后就靠它来定位子窗体啦。

     

    方法:

    left,top,right,bottom=win32gui.GetWindowRect(hnd)# 获取窗口位置-屏幕坐标中窗口的矩形
    win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST,x,y,400,400,win32con.SWP_SHOWWINDOW)
    title = win32gui.GetWindowText(hnd)     #获取某个句柄的标题
    clsname = win32gui.GetClassName(hnd)#获取某个句柄的类名
    
    GetClientRect            #在客户端坐标中返回窗口客户区的矩形
    SetWindowPos          #设置窗口的位置和大小
    SetWindowPlacement#设置窗口位置的RegisterClass
    
    ScreenToClient #将屏幕坐标转换为客户端坐标
    ClientToScreen #将客户端坐标转换为屏幕坐标
    
    HCURSOR = win32gui.GetCursor()
    win32api.SetCursorPos([30,50])         # 鼠标定位到(30,50)
    
    ctrlid=win32gui.GetDlgCtrlID(hwnd)     #控件的窗口id
    ctrl2=win32gui.GetDlgItem(hwnd,ctrlid)#控件句柄
    
    buffer = '0' *50
    len = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度
    win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, len, buffer)          #读取文本
    print('buffer=',len,buffer) 

    方法:

    menuHandle = win32gui.GetMenu(subHandle)# 获得窗口的菜单句柄
    # 获得子菜单或下拉菜单句柄
    subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)# 参数:菜单句柄 子菜单索引号
    # 获得菜单项中的的标志符,注意,分隔符是被编入索引的
    menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0)# 参数:子菜单句柄 项目索引号

    方法:

    # 发送消息,加入消息队列,无返回
    win32gui.postMessage(subHandle,win32con.WM_COMMAND, menuItemHandle, 0)
    参数:句柄 消息类型 WParam IParam
           wParam的定义是32位整型,high word就是他的31至16位,low word是它的15至0位。
        当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用。
        把HIWORD的常数向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。 

    方法:

    下选框内容更改
    参数:下选框句柄; 消息内容; 参数下选框的哪一个item,以0起始的待选选项的索引;
    如果该值为-1,将从组合框列表中删除当前选项,并使当前选项为空;
    参数CB_Handle为下选框句柄,PCB_hnd下选框父窗口句柄
    win32api.SendMessage(CB_hnd, win32con.CB_SETCURSEL, 1, 0) 

    方法:

    下选框的父窗口命令
    参数:父窗口句柄; 命令; 参数:WParam:高位表示类型,低位表示内容;参数IParam,
    下选框句柄CBN_SELENDOK当用户选择了有效的列表项时发送,提示父窗体处理用户的选择。
    LOWORD为组合框的ID. HIWORD为CBN_SELENDOK的值。
    win32api.SendMessage(PCB_hnd, win32con.WM_COMMAND, 0x90000, CB_hnd)

    方法:

    CBN_SELCHANGE当用户更改了列表项的选择时发送,
    不论用户是通过鼠标选择或是通过方向键选择都会发送此通知。
    LOWORD为组合框的ID. HIWORD为CBN_SELCHANGE的值。
    win32api.SendMessage(PCB_hnd, win32con.WM_COMMAND, 0x10000, CB_hnd)

    方法:

    # 设置文本框内容,等窗口处理完毕后返回true。中文需编码成gbk
    # 参数:句柄;消息类型;参数WParam,无需使用; 参数IParam,要设置的内容,字符串
    win32api.SendMessage(hnd,win32con.WM_SETTEXT,0,os.path.abspath(fgFilePath).encode('gbk'))
    
    # 控件点击确定,处理消息后返回0
    # 参数:窗口句柄; 消息类型; 参数WParam HIWORD为0(未使用),LOWORD为控件的ID;
     参数IParam  0(未使用),确定控件的句柄
    win32api.SendMessage(Mhnd, win32con.WM_COMMAND, 1, confirmBTN_hnd)
    
    # 获取窗口文本不含截尾空字符的长度
    # 参数:窗口句柄; 消息类型; 参数WParam; 参数IParam
    
    bufSize = win32api.SendMessage(subHandle, win32con.WM_GETTEXTLENGTH, 0, 0) +1
    # 利用api生成Buffer
    strBuf = win32gui.PyMakeBuffer(bufSize)
    print(strBuf)
    
    # 发送消息获取文本内容
    # 参数:窗口句柄; 消息类型;文本大小; 存储位置
    length = win32gui.SendMessage(subHandle, win32con.WM_GETTEXT, bufSize, strBuf)
    text = str(strBuf[:-1])# 反向内容,转为字符串
    
    address, length = win32gui.PyGetBufferAddressAndLen(strBuf)
    text = win32gui.PyGetString(address, length)
    win32api.MessageBox(hnd,text,text)
    print('text: ', text) 
    2.鼠标单击事件:
    win32api.SetCursorPos([30,50])#鼠标定位到(30,50)
    #执行左单键击,若需要双击则延时几毫秒再点击一次即可
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    #右键单击
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)

    实例:

    def click1(x,y): #第一种
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
    
    def click2(x,y):               #第二种
        ctypes.windll.user32.SetCursorPos(x,y)
           ctypes.windll.user32.mouse_event(2,0,0,0,0)
           ctypes.windll.user32.mouse_event(4,0,0,0,0)
    
    def click_it(pos):             #第三种
      hnd= win32gui.WindowFromPoint(pos)
        client_pos =win32gui.ScreenToClient(hnd,pos)
        tmp=win32api.MAKELONG(client_pos[0],client_pos[1])
        win32gui.SendMessage(hnd, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)
        win32gui.SendMessage(hnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)
        win32gui.SendMessage(hnd, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON,tmp)
    

     

    实例:

    # 发送回车
    win32api.keybd_event(13,0,0,0)
    win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)

    实例:

    # 关闭窗口
    win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)
    
    # 检查窗口是否最小化,如果是最大化
    if(win32gui.IsIconic(hhwnd)):
        #   win32gui.ShowWindow(hhwnd, win32con.SW_SHOWNORMAL)
        win32gui.ShowWindow(hhwnd, 8)
        sleep(0.5) 

    说明:

    参数说明

    SW_HIDE

    隐藏窗口并激活其他窗口。nCmdShow=0。
    SW_MAXIMIZE最大化指定的窗口。nCmdShow=3。
    SW_MINIMIZE最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
    SW_RESTORE激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。
     在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
    SW_SHOW在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
    SW_SHOWDEFAULT依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,
     STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess。nCmdShow=10。
    SW_SHOWMAXIMIZED激活窗口并将其最大化。nCmdShow=3。
    SW_SHOWMINIMIZED激活窗口并将其最小化。nCmdShow=2。
    SW_SHOWMINNOACTIVE窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
    SW_SHOWNA以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
    SW_SHOWNOACTIVATE以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
    SW_SHOWNORMAL激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。
     应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。

     

    实例:

    # win32虽然也可控制键盘,但不如使用PyUserInput的方便
    from pymouse import PyMouse
    from pykeyboard import PyKeyboard
    m = PyMouse()
    k = PyKeyboard()
    
    x_dim, y_dim = m.screen_size()
    # 鼠标点击
    m.click(x_dim/2, y_dim/2, 1)
    # 键盘输入
    k.type_string('Hello, World!')
    
    # 按住一个键
    k.press_key('H')
    # 松开一个键
    k.release_key('H')
    # 按住并松开,tap一个键
    k.tap_key('e')
    # tap支持重复的间歇点击键
    k.tap_key('l',n=2,interval=5)
    # 发送判断文字
    k.type_string('123456')
    
    #创建组合键
    k.press_key(k.alt_key)
    k.tap_key(k.tab_key)
    k.release_key(k.alt_key)
    # 特殊功能键
    k.tap_key(k.function_keys[5]) # Tap F5
    k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad
    k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice
    
    # Mac系统
    k.press_keys(['Command','shift','3'])
    # Windows系统
    k.press_keys([k.windows_l_key,'d'])
    # 其中的PyMouseEvent和PyKeyboardEvent还可用于监听鼠标和键盘事件的输入

     

      

    展开全文
  • Android应用程序模型:应用程序,任务,进程和线程 大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows系统里的.exe)、它所运行的进程以及和用户交互的图标和应用之间有一种严格的1对1关系。...

    Android应用程序模型:应用程序,任务,进程和线程

     

    大多数操作系统,在应用程序所寄存的可执行程序映像(如Windows系统里的.exe)、它所运行的进程以及和用户交互的图标和应用之间有一种严格的11关系。在Android系统里,这些关联要松散得多。并且重要的是要理解各种概念怎么样组成整体。

    由于Android应用固有的灵活性,当实现这些不同方面的时候有一些基本术语需要加以理解:

    • 一个Android .apk)文件,其中包含一个应用程序的代码和资源。这是应用程序分发和下载的文件,用户用来安装该应用程序在他们的设备上。
    • 一个任务一般而言是指用户视为的一个可启动应用程序:通常任务在桌面(home screen)有一个可访问的图标,且可以被切换到前台。
    • 一个进程是一个运行着应用程序代码的底层核心过程。通常所有.apk里的代码运行在一个专有的进程里。不过,进程标记也可以用来限定代码运行位置,或者为整个.apk或者为个别的活动activity,接收者receiver服务或提供者provider,组件。

    任务

    这里的一个关键点是:当用户看到一个应用时,他们实际上在和任务打交道。如果您刚刚创建一个包含若干活动的.apk,其中之一是顶层入口点(通过动作android.intent.action.MAIN的意图过滤器intent-filter和类别android.intent.category.LAUNCHER),那么这事实上将为您的.apk创建一个任务,并且您从那儿起动的任何活动都将作为那个任务的一部分运行。

    一个任务,那么,从用户的角度来看是您的应用程序;而从应用程序开发者的角度来看,它是一个或多个用户在那个任务中已经经历过且未关闭的活动,或者说是一个活动栈。一个新的任务通过以Intent.FLAG_ACTIVITY_NEW_TASK标志起动一个活动意图来创建;这一意图将被用来作为任务的根意图,定义任务是什么。任何不以这个标志起动的活动将和起动它的活动在相同的任务中运行(除非该活动已请求特别启动模式,稍后会讨论)。任务可以被重新安排:如果您使用FLAG_ACTIVITY_NEW_TASK标志但已经有一个任务以这个意图运行,则当前任务的活动栈将被切换到前台而不是开始一个新的任务。

     

    FLAG_ACTIVITY_NEW_TASK必须谨慎使用:使用它意味着,在用户看来,一个新的应用程序由此起动。如果这不是你所期望的行为,你就不该去创建一个新的任务。另外,仅在用户可以从桌面返回到他原来的地方和以一个新任务启动相同意图的情况下,你才应该使用新的任务标记。否则,如果用户在你已经启动的任务里按桌面(HOME)键,而不是返回(BACK)键,你的任务及其活动将被放置到桌面后面,没有办法再切换回去。

     

     

    任务共用性Affinity

    在某些情况下,Android需要知道一个活动属于哪个任务即使它没有被启动到一个具体的任务里。这是通过任务共用性(Affinities)完成的。任务共用性(Affinities)为这个运行一个或多个活动的任务提供了一个独特的静态名称,默认的一个活动的任务共用性(Affinity)是实现了该活动的.apk包的名字。这提供了预期的标准特性,即所有在一个特定的.apk包里的活动是单个用户应用程序的一部分。

    当开始一个没有Intent.FLAG_ACTIVITY_NEW_TASK标志的活动时,任务共用性affinities不会影响将会运行该新活动的任务:它总是运行在启动它的任务里。但是,如果使用了NEW_TASK标志,那么共用性(affinity)将被用来判断是否已经存在一个有相同共用性(affinity)的任务。如果是这样,这项任务将被切换到前面而新的活动会启动于这个任务的顶层。

     

    这种特性在您必须使用NEW_TASK标志的情况下最有用,尤其是从状态栏通知或桌面快捷方式启动活动时。结果是,当用户用这种方式启动您的应用程序时,它的当前任务将被切换到前台,而且想要查看的活动被放在最上面。

    你可以在程序清单(Manifest)文件的应用程序application标签中为.apk包中所有的活动分配你自己的任务共用性Affinites,或者在活动标记中为各个活动进行分配。一些说明其如何使用的例子如下:

    • 如果您的.apk包含多个用户可以启动的高层应用程序,那么您可能需要对用户看到的每个活动指定不同的affinities。一个不错的命名惯例是以附加一个以冒号分隔的字符串来扩展您的.apk包名。例如,“ com.android.contacts ”.apk可以有affinities:“com.android.contactsDialer”“ com.android.contactsContactsList”
    • 如果您正在替换一个通知,快捷方式,或其他可以从外部发起的应用程序的内部活动,你可能需要明确设定您替代活动的taskAffinity和您准备替代的应用程序一样。例如,如果您想替换contacts详细信息视图(用户可以创建并调用快捷方式),你得把taskAffinity设置成“com.android.contacts”

    启动模式和启动标志

      

    您控制活动和任务交互的主要途径是通过活动的launchMode 属性和意图相关的标志flags。这两个参数可以以各种方式合作来控制活动启动的结果,正如它们相关文档中描述的那样。在这里,我们将看看一些常见的用例和参数组合。

    你将使用的最常见的启动模式(除了默认的standard模式)是singleTop。这并不影响任务;它只是避免多次在一个堆栈顶部起动同一活动。

     

    singleTask启动模式对任务有重大的影响:它使活动始终是开始于一项新的任务(或其现有的任务被带到前台) 。使用这种模式需要谨慎对待你如何与系统其他部分进行交互,因为这影响到这个活动中的每一个路径。它应当仅在活动处于应用程序前台时使用(也就是支持MAIN动作和LAUNCHER类别)。

    singleInstance启动模式更是专业,并应仅用于整个就是被实现为一个活动的应用程序中。

    有一种你会经常遇到的情况是当另一个实体(如SearchManager NotificationManager)开始您的一个活动。在这种情况下,必须使用Intent.FLAG_ACTIVITY_NEW_TASK 标签,因为该项活动是在任务之外起动的(而且应用/任务可能根本不存在)。正如前面所述,这种情况下的标准行为是把匹配新活动affinity的任务带到前台和在此之上起动新的活动。不过,也有其他您可以实施的行为类型。

     

    一种通常的办法是和NEW_TASK联合起来使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志。这样,如果您的任务已经运行,那么它将会被带到前台,除根活动外其它所有堆栈中的活动都被清除,而且这个根活动的方法onNewIntent(Intent)会在该意图起动时被调用。注意这个活动使用这个方法时经常使用singleTop或者singleTask起动模式,这样当前实例被赋予新的意图而不是需要销毁它然后重新起动一个新的实例。

     

    您能采取的另外的方法是设置通知活动的任务affinity为空字符串“”(表示没有affinity),并设置finishOnBackground属性。这种方法是有用的如果你希望这个通知把用户带到一个单独的描述它的活动中,而不是返回到应用程序的任务。通过指定这个属性,该活动将被结束不管用户通过BACK还是HOME离开它;如果这个属性没有指定,按首页将导致这个活动及其任务仍保留在系统里,且可能没有办法返回它。

    请务必阅读关于launchMode属性Intent标志的文档以获取这些选项的详细说明。

     

     

    进程

     

    Android里,进程完全是应用的实现细节,而不是用户通常了解的那样。其主要用途就是:

    • 通过安置不受信任的或不稳定的代码到另一个进程来提高稳定性或安全性。
    • 通过在同一进程里运行多个.apks的代码来减少开销。
    • 通过把重量级代码放在单独的进程中来帮助系统管理资源,该进程可以在不影响应用程序其他部分的情况下被终止。

    正如前面所述,这个进程属性用来控制运行着特定应用程序组件的进程,注意,此属性不能用于违反系统安全性:如果有两个不共享相同用户ID.apks尝试运行在同一进程中,这将不会被允许,相反会为它们每一个创建不同的进程。

    参见安全 文档以获取更多关于安全限制方面的信息。

     

     

    线程

    每个进程包含一个或多个线程。多数情况下,Android避免在进程里创建额外的线程,以保持应用程序单线程,除非它创建自己的线程。一个重要的结果就是所有对活动Activity,广播接收器BroadcastReceiver以及服务Service实例的调用都是由这个进程的主线程创建的。

    注意新的线程并不会为每个活动,广播接收器,服务或者内容提供器(ContentProvider)实例而创建:这些应用程序的组件在进程里被实例化(除非另有说明,都在同一个进程处理),实际上是进程的主线程。这说明当被系统调用时没有哪个组件(包括服务)会进行远程或者阻塞操作(就像网络调用或者计算循环),因为这将阻止进程中的所有其他组件。你可以使用标准的线程Thread或者AndroidHandlerThread便捷类去对其它线程执行远程操作。

    这里有一些关于这个线程规则的重要的例外:

      IBinder或者IBinder实现的接口的调用由调用线程或本地进程的线程池(如果该呼叫来自其他进程)分发,而不是它们的进程的主线程。特殊情况下,一个服务IBinder可以这样调用。(尽管调用服务里的方法已经在主线程里完成。)这意味着IBinder接口的实现必须要有一种线程安全的方法,这样任意线程才能同时访问它。
     
    对ContentProvider主要方法的调用由调用线程或者主线程分发,如同IBinder一样。被指定的方法在内容提供器的类里有记录。这意味着实现这些方法必须要有一种线程安全的模式,这样任意其它线程可以同时访问它。
     
    视图及其子类中的调用由正在运行着视图的线程产生。通常情况下,这会被作为进程的主线程,如果你创建一个线程并显示一个窗口,那么继承的窗口视图将从那个线程里启动。

     

    展开全文
  • 相信大家还记得在Windows 7系统下,我们通过Alt+Tab组合快捷键的时候会出现一个非常酷炫的3D滚动模式的桌面,这个功能可以用于打开的应用程序之间的切换。当打开多个程序或者多层资源管理器时,无需通过任务栏逐个...

    相信大家还记得在Windows 7系统下,我们通过Alt+Tab组合快捷键的时候会出现一个非常酷炫的3D滚动模式的桌面,这个功能可以用于打开的应用程序之间的切换。当打开多个程序或者多层资源管理器时,无需通过任务栏逐个查找,就能够快速而炫丽的打开需要的程序。

    但是到了Windows 8系统,透明而酷炫的Aero效果被取消了,并且在“开始”屏幕上也没有任务栏可查看,如果启动了多个任务之后,使用鼠标或者触摸方式操作程序切换就变得很困难。其实,相比于Win7,Windows 8系统不仅保留了之前的切换进程方式,而且还在原有基础上增添了新的切换进程功能。

    首先我们来看看在Windows 8系统中新增的常规的程序切换方法:

    常规程序切换方式

    鼠标

    不管是在开始屏幕,还是传统桌面,只需将鼠标移动到屏幕的左上角,即可显示当前打开的程序缩略窗口,鼠标点击即可到达,并且可以在这个小缩略图上单击鼠标右键来“关闭”这个程序。

    多任务窗口 Win8应用程序切换操作方法

    微软 Windows 8

    满意度:

    3.00满意度排名:-位

    多任务窗口 Win8应用程序切换操作方法

    ▲左上角

    多任务窗口 Win8应用程序切换操作方法

    ▲左下角

    触摸屏

    与传统的电脑不同,在平板电脑上一般不会再连接鼠标,在触摸屏上操作Windows 8 当然更具优势,所有的功能相比鼠标一点儿也不差,而且体验效果也更好。

    用一个手指放到屏幕的左侧,向右轻轻滑动,即可出现打开的程序窗口,松开手指即可。

    多任务窗口 Win8应用程序切换操作方法

    ▲触摸屏操作

    接下来我们再来看看快捷键切换程序的操作方式

    跟Windows 7系统的程序切换快捷键一样,通过Alt + Tab 组合键来切换程序,只是与Windows 7那个3D效果不一样了。

    首先按住 Alt 键,再按 Tab 键,就在桌面上弹出一个横向的切换缩略图栏,然后每按一次Tab键即可切换一次程序,切换到缩略图的同时,背景随之改变到当前窗口,松下即可。当然也可以在按下Alt+Tab组合键后,用鼠标直接点击需要的应用程序。

    多任务窗口 Win8应用程序切换操作方法

    ▲Alt + Tab 切换程序

    结语:作为全新的操作系统,Windows 8不仅仅是改变了一些操作,在功能和便捷操作上的优化也很多,因此我们在使用Win8系统的时候,多体会,多尝试,也许一些小的发现会给你带来十分便捷的操作体验,从而大大提高工作效率!

    展开全文
  • 使用命令行打开应用程序

    万次阅读 多人点赞 2019-05-16 22:36:19
    当桌面图标太多时或者在多个窗口进行作业不想返回桌面时,可以使用命令行方式打开指定的应用程序
  • windows程序窗口

    千次阅读 2010-09-29 11:43:00
    窗口Z次序:表明了重叠窗口堆中窗口的位置,这...应用程序通过设置WS_EX_TOPMOST风格创建最顶层窗口。 一般情况下,Windows系统把刚刚创建的窗口放在Z次序的顶部,用户可以通过另外一个窗口来改变Z次序;Wi
  • Windows 系统组合键

    千次阅读 2011-10-18 14:22:11
    Windows 系统组合键 F1:帮助 CTRL+ESC:打开“开始”菜单 ALT+TAB:在打开的多个程序之间切换 ALT+F4:退出程序 SHIFT+DELETE:永久删除项目 Windows 徽标+L:锁定计算机 (不使用 CTRL+ALT+DELETE) -
  • delphi 应用程序开发工具

    千次阅读 2016-07-07 15:02:20
    应用程序开发工具 Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。它的前身,即是DOS时代盛行一时的“BorlandTurbo Pascal”,最早的版本由美国Borland...
  • 在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC程序就会立刻退出,之所以会这样,是因为按下Enter时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的...
  • C#程序设计及宿舍管理系统实战 ... MDI应用程序介绍 在VC#中,MDI应用程序由两部分组成,即MDI父窗体和MDI子窗体。...一个MDI应用程序可以包含一个或多个MDI父窗体,每个MDI父窗体又可以包...
  • macbook pro OX你可能不知道的组合键

    千次阅读 2019-05-10 18:46:05
    OS x: 键盘快捷方式 您可以使用键盘快捷键来做的事情在你的 Mac 上通过按键盘上的组合。...你可以看到映射到多个快捷方式,通过在应用程序菜单中查找的。 修改是很多的键盘快捷方式的一部分。修改...
  • 所谓快捷键就是使用键盘上某一个或某几个键的组合完成一条功能命令,从而达到提高操作速度的... 下面来看看各种键盘键的功能和组合键的功能 一、最常用的快捷键 二、键盘快捷键和组合键的功能  Ct
  • MSDEV.EXE-应用程序错误解决办法.

    热门讨论 2010-01-17 14:04:47
    使用VS6.0(VC++ or other)打开或添加项目时出现[MSDEV.EXE-应用程序错误"0x5003eaed"指令引用的"0x0000000"内存,该内存不能为"read";"0x73d311c7"指令引用的"0x00000004"内存,该内存不能为"read" ],这个可能是VS6.0...
  • win32程序窗口的创建

    万次阅读 2011-11-18 15:21:15
    尽管Windows应用程序千变万化,令人眼花缭乱,但,消息机制和窗口过程却始终它们的基础,掌握了这两项技术,也就相当于把握住了问题的关键。  如果你以前是C程序员或是MFC的忠实用户,只要你学习过C语言的语法,...
  • 特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。作者系LiAnLab.org资深Android技术顾问吴赫老师。本系列文章交流与讨论:@宋宝华...从创新层面上来说,Android编程上的思想和支持这种应用程序运行环境的系
  • VC 常见问题百问(1) 如何通过代码获得应用程序窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)//使程序最大化. (2) 确定...
  • pAdTy_5 构建可穿戴设备的应用程序

    千次阅读 2015-12-23 22:00:35
    2015.12.23 - 2016.01.13 ...这些节描述如何构建在手持应用程序中会自动同步到可穿戴设备上的通知(Notifications),同时描述如何构建运行在可穿戴设备上的应用程序。注:关于用在笔记中会使用到的APIs的信
  • 从一开始编程时,大家面对着黑乎乎的控制台窗口,就开始幻想什么时候...因此,一直想写一些真正能够引导大家入门的windows基础应用程序编程的文章。也顺便把自己所知道的东西顺便好好的整理一番。以此与大家共勉。 在
  • 控制台应用程序

    万次阅读 2006-03-15 01:09:00
    本篇复习 — 控制台应用程序和长文件名 在本章中包含的内容有控制台应用程序。它看起来象是 DOS 应用程序,但它可以访问 WIN32 提供的 4GB 地址空间。在本章中你还将看到如何使用长文件名以及 WIN32 文件 I/O 等内容...
  • Linux应用程序开发

    千次阅读 2013-12-24 11:27:59
    Linux应用程序开发 本文讲述了linux应用程序开发的基本内容。值得学习! Copyright © 2006 本文遵从GNU 的自由文档许可证(Free Documentation License)的条款,欢迎转载、修改、散布。 发布...
  • Hello China应用程序开发指南

    千次阅读 2012-02-26 17:25:51
    一个完整的操作系统,必须能够提供一套完整的工具和方法支持应用程序的开发。一般情况下,操作系统提供一组系统调用接口(API接口),程序员可以通过这一组API接口访问操作系统提供的服务。同时提供一个开发环境和...
  • CWinApp 应用程序

    千次阅读 2007-09-17 17:00:00
    CWinApp 应用程序类共63个成员(由Cobject-CCmdTarget-CWinThread派生)#include CWinApp类是你派生Windows应用程序对象的基类。应用程序对象提供初始化你的应用程序(及其每个实例)的成员函数,并运行该应用程序。每个...
  • Windows程序设计:第一个窗口

    千次阅读 2009-10-22 21:53:00
    .dml {border:2px solid green;width:200px;background-color:#eeeeee;margin:0 0 0 0}.ddm {background-color:#cccccc;margin-left:0mm} 目录: 1.窗口程序 2.分析 注册窗口类别
  • iPhone应用程序编程指南

    千次阅读 2012-04-28 17:29:46
    介绍 请注意:本文档之前命名为iPhone OS编程指南。 ...iPhone SDK为创建iPhone的本地应用程序提供必需的工具和资源。在用户的Home屏幕上,iPhone的本地应用...本地应用程序可以访问iPhone和iPod Touch的所有特性,
  • 打开VS2010,创建一个窗口应用程序,其次在设计文件中添加如下代码注册窗口关闭时触发的事件 在窗口设计界面按下快捷组合键 ctrl+alt+0进入代码编辑,编写事件处理代码: 在这里编写按下...
  • linux查看和关闭后台执行程序

    千次阅读 2017-11-02 14:31:56
    后台执行的程序会有一个pid,查看后台程序主要用到jobs,ps 关闭后台程序用到kill   详细说明转自http://blog.csdn.net/tianlesoftware/article/details/6165753 一. 有关进程的几种常用方法 1.1 & 符号...
  • 这是一个篇幅不长但是十分有用的教程,可以帮助你在终端启动一个Linux应用程序,并且使终端窗口不会丢失焦点。 我们有很多可以在Linux系统中打开一个终端窗口的方法,这取决于你的选择以及你的桌面环境。 如果是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,081
精华内容 16,432
关键字:

关闭当前应用程序窗口的组合键