LogicDaemon

Script for http://superuser.com/questions/429930 (.ahk)

Nov 27th, 2014
872
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #NoEnv
  2. #SingleInstance force
  3.  
  4. $~CapsLock::LangSwitch(1)
  5. $~CapsLock up::LangSwitch(2)
  6.  
  7. LangSwitch( iKeyDownUp=0 )
  8. {
  9.     static tickLast
  10.     IfEqual,iKeyDownUp,1
  11.     {   tickLast=%A_TickCount%
  12.         return
  13.     }
  14.     IfEqual,iKeyDownUp,2
  15.         If( A_TickCount-tickLast>200 )
  16.             return
  17.  
  18.     HKL:=DllCall("GetKeyboardLayout", "uint",GetThreadOfWindow(), "uint")
  19.  
  20.     HKLnum:=DllCall("GetKeyboardLayoutList","uint",0,"uint",0)
  21.     VarSetCapacity( HKLlist, HKLnum*4, 0 )
  22.     DllCall("GetKeyboardLayoutList","uint",HKLnum,"uint",&HKLlist)
  23.     loop,%HKLnum%
  24.     {   if( NumGet( HKLlist, (A_Index-1)*4 ) = HKL )
  25.         {   HKL:=NumGet( HKLlist, mod(A_Index,HKLnum)*4 )
  26.             break
  27.         }
  28.     }
  29.     ControlGetFocus,ctl,A
  30.     SendMessage,0x50,0,HKL,%ctl%,A ;WM_INPUTLANGCHANGEREQUEST
  31.  
  32.     ;show traytip
  33.     LOCALE_SENGLANGUAGE=0x1001
  34.     LOCALE_SENGCOUNTRY=0x1002
  35.     VarSetCapacity( sKbd, 260, 0 )
  36.     VarSetCapacity( sCountry, 260, 0 )
  37.     DllCall("GetLocaleInfo","uint",HKL>>16,"uint",LOCALE_SENGLANGUAGE, "str",sKbd, "uint",260)
  38.     DllCall("GetLocaleInfo","uint",HKL & 0xFFFF,"uint",LOCALE_SENGCOUNTRY, "str",sCountry, "uint",260)
  39.     traytip,%sKbd%,%sCountry%
  40.     SetTimer,REMOVE_TOOLTIP,500 ;0.5 second
  41.     return
  42. REMOVE_TOOLTIP:
  43.     SetTimer,REMOVE_TOOLTIP,off
  44.     traytip
  45.     return
  46. }
  47.  
  48. ;returns first thread for the <processID>
  49. ;sets optional <List> to pipe | separated thread list for the <processID>
  50. GetProcessThreadOrList( processID, byRef list="" )
  51. {
  52.     ;THREADENTRY32 {
  53.     THREADENTRY32_dwSize=0 ; DWORD
  54.     THREADENTRY32_cntUsage = 4  ;DWORD
  55.     THREADENTRY32_th32ThreadID = 8  ;DWORD
  56.     THREADENTRY32_th32OwnerProcessID = 12   ;DWORD
  57.     THREADENTRY32_tpBasePri = 16    ;LONG
  58.     THREADENTRY32_tpDeltaPri = 20   ;LONG
  59.     THREADENTRY32_dwFlags = 24  ;DWORD
  60.     THREADENTRY32_SIZEOF = 28
  61.  
  62.     TH32CS_SNAPTHREAD=4
  63.  
  64.     hProcessSnap := DllCall("CreateToolhelp32Snapshot","uint",TH32CS_SNAPTHREAD, "uint",0)
  65.     ifEqual,hProcessSnap,-1, return
  66.  
  67.     VarSetCapacity( thE, THREADENTRY32_SIZEOF, 0 )
  68.     NumPut( THREADENTRY32_SIZEOF, thE )
  69.  
  70.     ret=-1
  71.  
  72.     if( DllCall("Thread32First","uint",hProcessSnap, "uint",&thE ))
  73.         loop
  74.         {
  75.             if( NumGet( thE ) >= THREADENTRY32_th32OwnerProcessID + 4)
  76.                 if( NumGet( thE, THREADENTRY32_th32OwnerProcessID ) = processID )
  77.                 {   th := NumGet( thE, THREADENTRY32_th32ThreadID )
  78.                     IfEqual,ret,-1
  79.                         ret:=th
  80.                     list .=  th "|"
  81.                 }
  82.             NumPut( THREADENTRY32_SIZEOF, thE )
  83.             if( DllCall("Thread32Next","uint",hProcessSnap, "uint",&thE )=0)
  84.                 break
  85.         }
  86.  
  87.     DllCall("CloseHandle","uint",hProcessSnap)
  88.     StringTrimRight,list,list,1
  89.     return ret
  90. }
  91.  
  92. ; Returns thread owning specified window handle
  93. ; default = Active window
  94. GetThreadOfWindow( hWnd=0 )
  95. {
  96.     IfEqual,hWnd,0
  97.         hWnd:=WinExist("A")
  98.     DllCall("GetWindowThreadProcessId", "uint",hWnd, "uintp",id)
  99.     GetProcessThreadOrList(  id, threads )
  100.     IfEqual,threads,
  101.         return 0
  102.     CB:=RegisterCallback("GetThreadOfWindowCallBack","Fast")
  103.     lRet=0
  104.     lParam:=hWnd
  105.     loop,parse,threads,|
  106.     {   NumPut( hWnd, lParam )
  107.         DllCall("EnumThreadWindows", "uint",A_LoopField, "uint",CB, "uint",&lParam)
  108.         if( NumGet( lParam )=true )
  109.         {   lRet:=A_LoopField
  110.             break
  111.         }
  112.     }
  113.     DllCall("GlobalFree", "uint", CB)
  114.     return lRet
  115. }
  116.  
  117. GetThreadOfWindowCallBack( hWnd, lParam )
  118. {
  119.     IfNotEqual,hWnd,% NumGet( 0+lParam )
  120.         return true
  121.     NumPut( true, 0+lParam )
  122.     return 0
  123. }
Add Comment
Please, Sign In to add comment