SHARE
TWEET

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

LogicDaemon Nov 27th, 2014 308 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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top