Page 1 of 1

Everything AutoHotKey example

Posted: Thu Feb 15, 2024 10:11 pm
by NotNull
I was trying to see how far I could get using the SDK in AutoHotKey.

Further than I expected, but could not pass a Everything_GetResultSize hurdle: what type of struct is being used here? And how to translate that to AHK? Tried several syntaxes, but obviously all non working. Could not even get an error code (getlasterror)
Left it as-is in the following working script:

Code: Select all


;	Init
	EverythingDll := "Everything64.dll"
	EverythingLib := DllCall("LoadLibrary", "Str", A_ScriptDir . "\" . EverythingDll, "Ptr")


;	Set Search
	DllCall(EverythingDll . "\Everything_SetSearch", "Str", "exact:everything64.exe")


;	Execute Search and wait till done
	DllCall(EverythingDll . "\Everything_Query", "Int", True)


;	Parse results
 	Loop % DllCall(EverythingDll . "\Everything_GetNumResults", "UInt")
	{
		MsgBox %   DllCall(EverythingDll . "\Everything_GetResultFileName", "UInt", A_Index - 1, "Str") . "`n" 
	.	"Path: " . DllCall(EverythingDll . "\Everything_GetResultPath", "UInt", A_Index - 1, "Str") . "`n" 
	.  "Size: " . DllCall(EverythingDll . "\Everything_GetResultSize", "UInt", A_Index - 1, "UInt", &SIZE)
	}


;	Cleanup
	DllCall(EverythingDll . "\Everything_Reset")
	DllCall("FreeLibrary", "Ptr", EverythingLib)


Re: Everything AutoHotKey example

Posted: Thu Feb 15, 2024 10:24 pm
by void
From looking at AHK examples:

Code: Select all

DllCall("QueryPerformanceCounter", "Int64*", CounterBefore)
Sleep 1000
DllCall("QueryPerformanceCounter", "Int64*", CounterAfter)
MsgBox % "Elapsed QPC time is " . CounterAfter - CounterBefore

The Everything_GetResultSize call should look like:

Code: Select all

DllCall(EverythingDll . "\Everything_GetResultSize", "UInt", A_Index - 1, "UInt64*", SIZE)

Then print the size with:

Code: Select all

MsgBox % "Size: " . SIZE

Change:

Code: Select all

		MsgBox %   DllCall(EverythingDll . "\Everything_GetResultFileName", "UInt", A_Index - 1, "Str") . "`n" 
	.	"Path: " . DllCall(EverythingDll . "\Everything_GetResultPath", "UInt", A_Index - 1, "Str") . "`n" 
	.  "Size: " . DllCall(EverythingDll . "\Everything_GetResultSize", "UInt", A_Index - 1, "UInt", &SIZE)
to:

Code: Select all

ResultNameSize = 260
ResultPathSize = 260
VarSetCapacity(ResultName, ResultNameSize)
VarSetCapacity(ResultPath, ResultPathSize)

...

	DllCall(EverythingDll . "\Everything_GetResultFileNameW", "UInt", A_Index - 1, "Str", ResultName)
	DllCall(EverythingDll . "\Everything_GetResultFilePathW", "UInt", A_Index - 1, "Str", ResultPath)
	DllCall(EverythingDll . "\Everything_GetResultSize", "UInt", A_Index - 1, "UInt64*", ResultSize)

	MsgBox %   ResultName . "`n" . "Path: " . ResultPath . "`n" .  "Size: " . ResultSize
Use Everything_GetResultFileNameW instead of Everything_GetResultFileName (I assume AHK works with Unicode)
Use Everything_GetResultFilePathW instead of Everything_GetResultFilePath (I assume AHK works with Unicode)

That should get you some result details, from there you can check if each DllCall call succeeds (returns non-zero)
Use Everything_GetResultFullPathNameW for the full path and filename.



AHK DllCall:
https://documentation.help/AHK_H-2.0/DllCall.htm

How to obtain textual contents from a window:
https://stackoverflow.com/questions/18052879/how-to-obtain-textual-contents-from-a-window