AutoHotKey_Lがキーを掴まなくなったらReloadするようにしたかった……。

 なんか時折AHKがキーを掴まなくなることがあって、仕込んであるリロード用ホットキーも使えないので、タスクトレイアイコンからリロードするはめになるのだけど、自動化のために存在するAHKを自動化できないなんて云々というわけで、自動化してみた。

  SetTimer, ReloadAHK, 5000

ReloadAHK:
  ReloadAHKSw := 1
  Send, {Help}  ; 使わないキー
  Sleep, 1000
  if ReloadAHKSw && !A_IsSuspended {
    Reload
  }
return

Help::
  ReloadAHKSw := 0
return

 ホットキーが効かなければReloadするってだけだが、これで対処可能なのか、狙って試せないのでわからない。数日使って問題の状態にならないので、対処できてる、できてるんじゃないかな?ry

 うーむやはりダメっぽい。キーを掴まないが発行は正しく行われてるのか。権限絡みか?


[PR]
# by LordNoesis | 2018-10-17 18:07 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、プロセス間通信経由して一般権限でRunしてみた。ver.1.2

 UIPIの制限を回避するため、常駐AHKは管理者権限で実行しているのだが、それゆえにRunした時に不要な特権が付与されてしまう。それを回避する手段はいくつかあるものの、どれも一長一短で、最終的に「一般権限の常駐AHKにプロセス間通信でパスを送ってRun」に行きついた。最初からそうしとけって話だが、旧人類なので常駐増やしたくないのだ!

 Receive2Run.ahkを一般権限で常駐させて、管理者権限AHKからRunNEXすれば、R2Rが代わりにRunしてくれる。

 "|"はEverythingにクエリ送るとき使ってたので、区切り文字はAHKらしく"`n"にした。

; 管理者権限のAHKに書くやつ

RunNEX(Cmdline, WorkDir = "", Opt = "", ByRef Pid = "") {
  SetTitleMatchMode 2
  DetectHiddenWindows On
  
  sig := "RunNEX:"
  
  SendHwnd := WinExist("Receive2Run. ahk_class AutoHotkey")
  if (0 == SendHwnd) {
    MsgBox, 262160, , Receive2Runが見つかりません。
    return
  }
  
  if !WorkDir {
    WorkDir := A_WorkingDir
  }
  
  StringToSend := sig Cmdline "`n" WorkDir "`n" Opt
  
  Result := Send_WM_COPYDATA(StringToSend, "ahk_id " SendHwnd)
  if (0 < Result) {
    Pid := Result
  } else {
    MsgBox,Err!`n%Result%

  }
}

;http://www.autohotkey.com/community/viewtopic.php?t=76704
Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle) {
  PtrSize := A_PtrSize ? A_PtrSize : 4
  VarSetCapacity(CopyDataStruct, 3*PtrSize, 0)
  SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1)
  NumPut(SizeInBytes, CopyDataStruct, PtrSize)
  NumPut(&StringToSend, CopyDataStruct, 2*PtrSize)
  
  SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle%
  return ErrorLevel
}

;/////////////////////////////////////////////////////////////////////////////////////
;
; Receive2Run.ahk
;
;/////////////////////////////////////////////////////////////////////////////////////
  #SingleInstance, Force
  #NoEnv
  #Persistent
  SetBatchLines, -1
  Menu, Tray, Icon, SHELL32.dll, 262
  
  sig := "RunNEX:"
  
  if A_IsAdmin {
    MsgBox, 262160, , 管理者権限で起動しないでください。
    ExitApp
  }
  
  OnMessage(0x4a, "Receive_WM_COPYDATA")
return

;http://www.autohotkey.com/community/viewtopic.php?t=76704
Receive_WM_COPYDATA(wParam, lParam) {
  global sig
  PtrSize:=A_PtrSize ? A_PtrSize : 4
  StringAddress := NumGet(lParam + 2*PtrSize)
  CopyOfData := StrGet(StringAddress)
  
  if RegExMatch(CopyOfData, "^" sig "([^\n]+)(?:\n([^\n]*))?(?:\n([^\n]*))?(?:\n([^\n]*))?$", $) {
    TrgPath := $1
    WorkDir := $2
    Opt := $3
    
    TrgPid := 0
    Run, %TrgPath%, %WorkDir%, %Opt%, TrgPid
  } else {
    MsgBox, Err!`n%CopyOfData%

  }
  return TrgPid
}

 メッセージ受け取ってRunとかいかにも悪用されそうなので、とりあえず符丁つけてみた。使うときは双方のsigを適当に書き換えてね。
 送り主を確認するとか他にやるべきことがあるのでは?という気もするが、所詮「とりあえず」なんで……。

 他の手段、「一般ユーザーでRunAS」「CreateProcessWithTokenWでShellから一般権限をコピー」「Shellに引数をつけてRun」とかあるのだけど――。RunAsはパスワードを平文で記録したくないのでNG。CreateProcessWithTokenWは複雑で、フォーラムにあったのコピペで試してたけど、動作したりしなかったり。で、Shellに.lnkを実行させるハックを愛用してたのだけど、これも近頃調子悪くなってしまい、諦めて常駐増やしたっちゅー……。



オマケ
[PR]
# by LordNoesis | 2018-06-15 19:08 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、OnTopReplicaを少し便利に。ver.1.0.1

 高解像度モニタやマルチモニタが便利なのは「視線移動だけで数多のウィンドウを確認できる」からだけど、文章でもない限りサムネで十分というか、むしろサムネの方が同時表示ウィンドウ数増えてよくね?と思ったので、それっぽいソフトを探したけどなかったから、既存のソフトを組み合わせてなんとかするの巻。

 というわけで、ウィンドウの縮小クローンを作成するソフト「OnTopReplica」が便利なのだけど、大抵の操作は縮小クローンより元ウィンドウでした方がよいので、OTRをクリックしたら元ウィンドウをアクティブにするAHK書いた。

;--------------------------------------------------------------------------------------
; OnTopReplica
;--------------------------------------------------------------------------------------
#IfWinActive ahk_exe OnTopReplica.exe
~LButton::return

LButton Up::
  if (400 < A_TimeSincePriorHotkey)
    return
  
  WHwnd := WinExist()
  
  BlockInput, On
  Send, {RButton}{Up}{Down 2}{Enter}
  WinWaitNotActive, ahk_id %WHwnd%, , 0.5
  WinActivate, ahk_id %WHwnd%
  BlockInput, Off
return

 メインの作業をしている裏で、入力に間のある作業(重い対話型ソフトとか、チャットやゲーム)をしている状況で、モニタの隅やセカンダリモニタあたりに縮小クローンを配置して、横目で見て変化があったらクリックするだけで操作可能になる。便利。

 なお、「元ウィンドウなどいらん、縮小ウィンドウを左クリックできれば十分!」という場合は「窓の化身」を使う。


[PR]
# by LordNoesis | 2018-04-09 22:45 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Stellarisのカーソル移動による自動スクロールを防止した。

 Stellarisやってて、ウィンドウ端にカーソル移動するとスクロールする仕様がウザったいのだが、設定でOFFにできないっぽいので、力業で封じてみた。

 まあ単に、監視して、カーソルがウィンドウ端に行ったらウィンドウ非アクティブにするだけなんで、ちょっと書き換えれば他でも使える。フルスクリーンとか知らぬ。

;------------------------------------------------------------
; Stellaris
;------------------------------------------------------------
#IfWinActive Stellaris ahk_class SDL_app ahk_exe stellaris.exe

F12::  ; マウスカーソルでスクロールしないようにする
  StlrsMargin := 2
  
  StellarisHwnd := WinExist()
  VarSetCapacity(CR, 16)
  DllCall("GetClientRect", Ptr, StellarisHwnd, Ptr, &CR)
  CW := NumGet(CR, 8, "Int")
  CH := NumGet(CR, 12, "Int")
  
  WinGetPos, , , WW, WH
  BW := (WW - CW) // 2
  
  StlrsX := BW + StlrsMargin
  StlrsY := WH - CH - BW + StlrsMargin
  StlrsX2 := BW + CW - StlrsMargin
  StlrsY2 := WH - BW - StlrsMargin
  
  SetTimer, StlrsChk, 250
return

StlrsChk:
  IfWinNotExist, ahk_id %StellarisHwnd%
  {
    SetTimer, StlrsChk, Off
    return
  }
  IfWinNotActive
    WinWaitActive
  
  MouseGetPos, MX, MY
  if (StlrsX >= MX) || (StlrsY >= MY) || (StlrsX2 < MX) || (StlrsY2 < MY)
    WinActivate, Program Manager ahk_class Progman ahk_exe explorer.exe
return

 AHKってクライアント領域の取得できないんか……。


[PR]
# by LordNoesis | 2018-02-21 23:32 | テクノロジ | Trackback | Comments(0)

Web版ハングアウトのフレンドリストをコンパクトにするUserCSS書いた。

 Web版ハングアウトのUIが無駄に広大で、ウィンドウ幅を縮めるとスクロールバーがウザいので、フレンドリスト以外の無駄な要素を消すCSS書いた。これで、せいせいChromeでアプリ化("デスクトップに追加")できる。

.gb_yg.gb_X.gb_T {
  min-width: 0px !important;
}
.g-Ue-Ja-t {
  min-width: 0px;
}
.kFx1Ae-xdwExf-eb.kFx1Ae-xdwExf-eb-wr {
  display: none;
}
.g-Ue-v0h5Oe {
  display: none;
}
.g-Qx-r4m2rf-wZVHld.Id-qy-By.r4m2rf-wZVHld-wr {
  display: none;
}

 まあ、XMPP対応が縮小されたものの、基本的なテキストチャットは問題なくできるので、Web版は画像送信時くらいしか使わないけども。
 余談だが、Web版はCtrl+vでクリップボードの画像データを送信できるので、Vivaldiのキャプチャー機能を「選択範囲」「クリップボード出力」で使うと、あらゆる画像をスタンプめいて使えて面白い。


[PR]
# by LordNoesis | 2017-12-12 20:30 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる