Mery用構文ファイル
MSBuild用プロジェクトファイルのテンプレート
.ahkファイルをExe化する。
<?xml version="1.0" encoding="utf-8" ?> <!-- MSBuild用プロジェクトファイルの例 同一フォルダにある.ahkファイルをExe化する このプロジェクトファイルは.ahkファイルと同じフォルダにあること --> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Ahk2Exe.exeのフルパス --> <PropertyGroup> <AHK2EXE>$(ProgramFiles)\AutoHotkey\Compiler\Ahk2Exe.exe</AHK2EXE> </PropertyGroup>
<!-- ソースファイル名;foo.ahk→foo.exeとする場合 --> <ItemGroup> <SOURCE_FILES Include="foo.ahk" /> <!-- <SOURCE_FILES Include="foo2.ahk" /> <SOURCE_FILES Include="foo3.ahk" /> : --> </ItemGroup>
<!-- ソースファイル名;bar.ahk→baz.exeとする場合 --> <ItemGroup> <SOURCE_FILES2 Include="bar.ahk"> <EXE_FILE>baz.exe</EXE_FILE> </SOURCE_FILES2> <!-- <SOURCE_FILES2 Include="bar2.ahk"> <EXE_FILE>baz2.exe</EXE_FILE> </SOURCE_FILES2> <SOURCE_FILES2 Include="bar3.ahk"> <EXE_FILE>baz3.exe</EXE_FILE> </SOURCE_FILES2> : --> </ItemGroup>
<!-- Buildターゲットからビルド後に呼び出されるターゲット --> <Target Name="Build" Inputs="@(SOURCE_FILES);@(SOURCE_FILES2)" Outputs="@(SOURCE_FILES->'%(Filename).exe');%(SOURCE_FILES2.EXE_FILE)"> <Exec Command="%22$(AHK2EXE)%22 /in %22%(SOURCE_FILES.Identity)%22" WorkingDirectory="$(MSBuildProjectDirectory)" Condition="'@(SOURCE_FILES->Count())' > 0" /> <Exec Command="%22$(AHK2EXE)%22 /in %22@(SOURCE_FILES2)%22 /out %22%(EXE_FILE)%22" WorkingDirectory="$(MSBuildProjectDirectory)" Condition="'@(SOURCE_FILES2->Count())' > 0" /> </Target>
</Project>
コマンドプロンプト:Ctrl+Vで貼り付け
NYAOSでも動作する。
#SingleInstance #IfWinActive ahk_class ConsoleWindowClass ^v::SendInput {Raw}%Clipboard% #IfWinActive
今日の日付をyyyymmdd形式で入力
::td:: Send,%A_YYYY%%A_MM%%A_DD% Return
平仮名・カタカナ変換など
LCMAP_BYTEREV := 0x00000800 ; Windows NT のみ : バイト順序を反転します。たとえば 0x3450 と 0x4822 を渡すと、結果は 0x5034 と 0x2248 になります。 LCMAP_FULLWIDTH := 0x00800000 ; 全角文字にします(適用される場合)。 LCMAP_HALFWIDTH := 0x00400000 ; 半角文字にします(適用される場合)。 LCMAP_HIRAGANA := 0x00100000 ; ひらがなにします。 LCMAP_KATAKANA := 0x00200000 ; カタカナにします。 LCMAP_LINGUISTIC_CASING := 0x01000000 ; 大文字と小文字の区別に、ファイルシステムの規則(既定値)ではなく、言語上の規則を使います。LCMAP_LOWERCASE、または LCMAP_UPPERCASE とのみ組み合わせて使えます。 LCMAP_LOWERCASE := 0x00000100 ; 小文字を使います。 LCMAP_SIMPLIFIED_CHINESE := 0x02000000 ; 中国語の簡体字を繁体字にマップします。 LCMAP_SORTKEY := 0x00000400 ; 正規化されたワイド文字並び替えキーを作成します。 LCMAP_TRADITIONAL_CHINESE := 0x04000000 ; 中国語の繁体字を簡体字にマップします。 LCMAP_UPPERCASE := 0x00000200 ; 大文字を使います。 NORM_IGNORECASE := 0x00000001 ; 大文字と小文字を区別しません。 NORM_IGNOREKANATYPE := 0x00010000 ; ひらがなとカタカナを区別しません。ひらがなとカタカナを同じと見なします。 NORM_IGNORENONSPACE := 0x00000002 ; 送りなし文字を無視します。このフラグをセットすると、日本語アクセント文字も削除されます。 NORM_IGNORESYMBOLS := 0x00000004 ; 記号を無視します。 NORM_IGNOREWIDTH := 0x00020000 ; シングルバイト文字と、ダブルバイトの同じ文字とを区別しません。 SORT_STRINGSORT := 0x00001000 ; 区切り記号を記号と同じものとして扱います。
flags := LCMAP_HALFWIDTH + LCMAP_KATAKANA word := "こんにちは。" length := 256 VarSetCapacity(output, length) DllCall("kernel32\LCMapString", "UInt", DllCall("kernel32\GetUserDefaultLCID"), "UInt", flags, "WStr", word, "Int", -1, "WStr", output, "Int", length) MsgBox,%output% VarSetCapacity(output, -1)
音声合成
Windows 7の場合、Microsoft Speech Platform 11以降とHaruka 日本語のインストールが必要。
objSp := ComObjCreate("Speech.SpVoice") ; 通常は Speech.SpVoice でOK ; objSp := ComObjCreate("SAPI.SpVoice") ; SAPI5対応日本語音声合成エンジンを使用する場合 objSp.Speak("庭には二羽ニワトリがいる。")
レーベンシュタイン距離を求める
; https://nayose.net/blog/address/246/ をベタ移植 lsDist(baseText, tryText) { If baseText = tryText Return 0 bl := StrLen(baseText) tl := StrLen(tryText) If bl = 0 Return tl If tl = 0 Then Return bl
matrix := [] Loop,% bl+1 matrix.push([A_Index-1]) Loop,% tl+1 matrix[1, A_Index] := A_Index - 1
Loop,%bl% { i := A_Index + 1 Loop,%tl% { j := A_Index + 1 If SubStr(baseText, i, 1) = SubStr(tryText, j, 1) cost := 0 Else cost := 1 matrix[i, j] := Min(matrix[i-1, j]+1, matrix[i, j-1]+1, matrix[i-1, j-1]+cost) } } Return matrix[bl+1, tl+1] }
Excelワークシートに対してSQLで問い合わせ
1行目は見出し(列名)であること。
; Excelワークシートに対してSQLで問い合わせ(ADO) ; 結果はクリップボードにコピーする
; 要2007 Office system ドライバ: データ接続コンポーネント ; インストールされていない場合は https://www.microsoft.com/ja-jp/download/details.aspx?id=23734 からDL
#SingleInstance
DefaultQuery := " ( SELECT COUNT(*) FROM [Sheet1$] ; )"
EM_SETCUEBANNER := 0x1501
Gui,New,,ExcelワークシートでSQL実行 Gui,Font,,MS UI Gothic
Gui,Add,Text,,SQL文(&S): Gui,Add,Edit,r15 vquery w340 xs+10 HwndqueryH,% DefaultQuery DllCall("SendMessageW", "Ptr", queryH, "UInt", EM_SETCUEBANNER, "Ptr", True, "WStr", "※入力必須")
Gui,Add,Button,gOnExecute xs,実行(&X)
Gui,Show Return
OnExecute: Gui,Submit,NoHide
If query = { MsgBox,SQL文が入力されていません Return }
FileSelectFile,file,33,,ファイルを開く,Excelファイル(*.xlsx;*.xls) If file = Return
;adOpenForwardOnly := 0 ;adOpenKeyset := 1 ;adLockReadOnly := 1 adUseClient := 3
objConnection := ComObjCreate("ADODB.Connection") Try { objConnection.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" . file . """;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;"";") } Catch e { MsgBox,% "Connectionオブジェクトの取得に失敗しました: " . e.Message . "`n中断します" ExitApp } objConnection.CursorLocation := adUseClient objRecordset := ComObjCreate("ADODB.Recordset") Try { ;objRecordset.Open(query, objConnection, adOpenForwardOnly, adLockReadOnly) objRecordset.Open(query, objConnection) } Catch e { MsgBox,% "クエリに失敗しました。恐らくSQL文が間違っています: " . e.Message Return }
report = If (!objRecordset.EOF And objRecordset.Fields.Count > 0) { ; 見出しを作成 report .= objRecordset.Fields(0).Name Loop,% objRecordset.Fields.Count - 1 { report .= "`t" . objRecordset.Fields(A_Index).Name } report .= "`r`n"
; 結果を作成 While !objRecordset.EOF { report .= objRecordset.Fields(0).Value Loop,% objRecordset.Fields.Count - 1 { report .= "`t" . objRecordset.Fields(A_Index).Value } report .= "`r`n" objRecordset.MoveNext }
Clipboard := report }
objRecordset.Close() objConnection.Close()
MsgBox,正常終了しました。結果はクリップボードにコピーされます Return
GuiClose: ExitApp
Excelのアクティブセルを始点としてCSVファイルをインポートする
; セルの文字列が 0 で始まる場合は表示形式を文字列にする xlCalculationAutomatic := -4105 xlCalculationManual := -4135
Try { objExcel := ComObjActive("Excel.Application") } Catch e { MsgBox,Excelが起動していません。中断します Return }
If (objExcel.Workbooks.Count < 1) { MsgBox,予め既存または新規のExcelブックを開き、インポート先シートをアクティブにしておいてください。中断します Return }
row := objExcel.Selection.Row col := objExcel.Selection.Column
FileSelectFile,csvfile,1,,CSVファイルを開く,CSV file (*.csv;*.txt) If csvfile = ExitApp
objExcel.Calculation := xlCalculationManual objExcel.ScreenUpdating := False Loop,Read,%csvfile% { y := A_Index Loop,Parse,A_LoopReadLine,CSV { If (StrLen(A_LoopField) > 1 && SubStr(A_LoopField,1,1) == "0") objExcel.ActiveSheet.Cells(row, col).Offset(y-1, A_Index-1).NumberFormatLocal := "@" objExcel.ActiveSheet.Cells(row, col).Offset(y-1, A_Index-1).Value := A_LoopField } } objExcel.ScreenUpdating := True objExcel.Calculation := xlCalculationAutomatic
Outlookで新規メールアイテムを作成
olMailItem := 0
; 送信先メールアドレス:複数指定時は ; で区切る toAddress := "送り先メールアドレス" ccAddress := "" bccAddress := ""
; サブジェクト subject := "TEST"
; %APPDATA%\Microsoft\Signatures\ フォルダ下にある署名ファイル(.txt) signFile := "署名.txt"
message := " ( :(ここにメール文面) )"
Try { objOutlook := ComObjActive("Outlook.Application") } Catch e { MsgBox,4,,% "Outlook が起動していません: " . e.Message . "`n当スクリプトをリロードしますか?" IfMsgBox,Yes Reload ExitApp }
objMailItem := objOutlook.CreateItem(olMailItem) If StrLen(toAddress) > 0 objMailItem.To := toAddress If StrLen(ccAddress) > 0 objMailItem.Cc := ccAddress If StrLen(bccAddress) > 0 objMailItem.Bcc := bccAddress objMailItem.Subject := subject objMailItem.Body := message If StrLen(signFile) > 0 objMailItem.Body .= "`n" . GetSignatures(signFile) objMailItem.Display(False)
GetSignatures(file) { FileRead,result,% A_AppData . "\Microsoft\Signatures\" . file return result }
Outlookのメール着信を監視
#Persistent
olMail := 43 ; MailItemオブジェクト
Try { objOutlook := ComObjActive("Outlook.Application") } Catch e { MsgBox,4,,% "Outlook が起動していません: " . e.Message . "`nスクリプトをリロードしますか?" IfMsgBox,Yes Reload ExitApp } ComObjConnect(objOutlook, "OL_")
OL_NewMailEx(entryIdCollection) { global objOutlook global olMail PR_SENT_REPRESENTING_EMAIL_ADDRESS := "http://schemas.microsoft.com/mapi/proptag/0x0065001e" ; FromがMLの場合、元々の差出人E-mailアドレス PR_SENT_REPRESENTING_NAME := "http://schemas.microsoft.com/mapi/proptag/0x0042001e" ; 同、表示名(E-mailアドレスの場合も) ; MLの場合、SenderNameやSenderEmailAddressプロパティでは元々の差出人が判らない arrEntryId := StrSplit(entryIdCollection, ",") Loop % arrEntryId.MaxIndex() { objMailItem := objOutlook.Session.GetItemFromID(arrEntryId[A_Index]) If (objMailItem.Class <> olMail) { Continue }
; 以下、ニーズによって処理が変わる。ここではクリップボードにメールアドレスなどコピー Clipboard = % "Subject=" . objMailItem.Subject . "`nSenderEmailAddress=" . objMailItem.SenderEmailAddress . "`nSenderName=" . objMailItem.SenderName . "`nCc=" . objMailItem.Cc ; 文面は objMailItem.Body ; 添付ファイルは objMailItem.Attachments ; MLなら objMailItem.PropertyAccessor.GetProperty(PR_SENT_REPRESENTING_EMAIL_ADDRESS) ; または objMailItem.PropertyAccessor.GetProperty(PR_SENT_REPRESENTING_NAME) } }
OL_ItemSend(objMailItem, ByRef isCancel) { global olMail If (objMailItem.Class <> olMail) { Return }
; 以下、ニーズによって処理が変わる MsgBox,48,Outlook,% objMailItem.To . " へメール送信",1 ; 送信をキャンセルする場合は isCancel = True に }
OL_Quit() { MsgBox,48,Outlook,Good bye,1 ExitApp }
Outlookのメール添付ファイルをマイドキュメントに保存
#SingleInstance #IfWinActive ahk_exe OUTLOOK.EXE
; Shift+F8: 添付ファイルをマイドキュメントに保存 +f8:: olMail := 43 ; MailItemオブジェクト objOutlook := ComObjActive("Outlook.Application") If (ComObjType(objOutlook.ActiveWindow, "Name") = "_Inspector") objMailItem := objOutlook.ActiveInspector.CurrentItem Else If (ComObjType(objOutlook.ActiveWindow, "Name") = "_Explorer" And objOutlook.ActiveExplorer.Selection.Count == 1) objMailItem := objOutlook.ActiveExplorer.Selection.Item(1) Else Return If (objMailItem.Class == olMail) { Loop % objMailItem.Attachments.Count { MsgBox,3,確認,% "【" . objMailItem.Attachments(A_Index).FileName . "】を保存しますか?" IfMsgBox,Yes objMailItem.Attachments(A_Index).SaveAsFile(A_MyDocuments . "\" . objMailItem.Attachments(A_Index).FileName) Else IfMsgBox,Cancel Break } } Return
#IfWinActive
sqlite3.dll利用
#Include Class_SQLiteDB.ahk ; ←https://github.com/AHK-just-me/Class_SQLiteDBからDL
db := new SQLiteDB MsgBox,% db.Version db.OpenDB(A_ScriptDir . "\test.db")
db.Exec("CREATE TABLE list(id INTEGER, title TEXT);")
sqlbase := "INSERT INTO list VALUES(#, 'test#');" Loop,10 { StringReplace,sql,sqlbase,#,%A_Index%,All sqls .= sql }
db.Exec("BEGIN TRANSACTION;") db.Exec(sqls) db.Exec("COMMIT TRANSACTION;")
db.GetTable("SELECT * FROM list WHERE id > 5;", tbl)
MsgBox,% tbl.ColumnNames[1] . ": " . tbl.ColumnNames[2] Loop,% tbl.RowCount { tbl.Next(r) MsgBox,% r[1] . ": " . r[2] }
db.CloseDB()
nMail.dll利用
; nMail.dllを使ったメール送信(nMail.dllはhttp://www.nanshiki.co.jp/からDL)
NULL := 0
DllCall("nMail\NMailInitializeWinSock") ;MsgBox,% "NMailGetVersion = " . DllCall("nMail\NMailGetVersion")
smtp := "SMTPサーバ名" to := "送信先メールアドレス" cc := NULL bcc := NULL from := "送信元メールアドレス" subject := "サブジェクト" body := "本文" header := NULL path := NULL flag := 0 port := 25 MsgBox,% "NMailSmtpSendMailPortNoW = " . DllCall("nMail\NMailSmtpSendMailPortNoW", "Str", smtp, "Str", to, ArgType(cc), cc, ArgType(bcc), bcc, "Str", from, "Str", subject, "Str", body, ArgType(header), header, ArgType(path), path, "Int", flag, "Int", port)
DllCall("nMail\NMailEndWinSock")
ArgType(arg) { Return arg ? "Str" : "Int" }
外人4コマジェネレータ
- gaijin4.zip…要ImageMagick 7.x(ImageMagickObjectの追加インストールが必要)。動作実績はWindows 7(x86)。肖像権とか侵害していそうだけど
DBテーブル作成スクリプト
- dbtable.zip… Excelのアクティブシートにある表(1列目が見出し、2列目以降がデータ)をSQLiteデータベーステーブルに変換する。結合セルがある表は処理できない。非表示行・非表示列も読み込む。要Class_SQLiteDB.ahkおよびsqlite3.dll