1

Тема: AHK: Добавить окну эффект тени

День добрый.
Запускаю внешнюю программку из скрипта, а там так неудобно сделано, все окно белое и другие элементы в светлых тонах, плохо видно. Причем никакой границы у окна нет и тени тоже нет.
Я добавил окну  Style +0x800000  WS_BORDER, стало получше, а добавить тень так и не получилось.
Пробовал другие стили, которые нашел на форуме, но, пока не помогло.
Так же читал документацию на сайте Майкрософт об CS_DROPSHADOW и SPI_SETDROPSHADOW, но, как там это все сделать пока знаний недостаточно.
Может быть кто-нибудь решал подобную задачу?

2

Re: AHK: Добавить окну эффект тени

Путем поисков нарыл:
https://www.autoitscript.com/forum/topi … d-dialogs/
Вроде то, что нужно, только для autoit, теперь думаю, для для  AHK переделать.

3

Re: AHK: Добавить окну эффект тени

На оф. форуме как-то к GUI приспособили: https://autohotkey.com/board/topic/24934-shadow/.

4

Re: AHK: Добавить окну эффект тени

ypppu, да уже видел, попробовал, у меня тень как-то "задвоилась" + не получилось добавить стиль не AHK GUI.

Вот еще нашел:
https://marcin.floryan.pl/blog/2010/08/ … ws-dwm-api
Насколько я понимаю C#, вроде то, что нужно, только как тоже самое записать на AHK.

5 (изменено: Malcev, 2017-01-14 03:39:20)

Re: AHK: Добавить окну эффект тени

ypppu, у меня этот код не работает (тень к гуи не добавляет), хотя по справке с майкрософт должен.

6

Re: AHK: Добавить окну эффект тени

Разобрался.
Чтобы в своем гуи работало, надо в настройках "perfomance options" поставить "show shadows under windows".
Но в чужом у меня не получается - пишет access denied.
Тут либо надо dll в процесс вставлять, либо хук какой-то делать.
Надо ждать помощи от тех, кто в теме - teadrinker, YMP...

hwnd := WinExist("ahk_class MozillaWindowClass")
GetClassLong := DllCall("GetClassLong" (A_PtrSize=8 ? "Ptr":""), "Ptr", hwnd, "int", -26)
if A_LastError != 0
   msgbox % "GetClassLong error:`n" GetErrorString(A_LastError)
DllCall("SetClassLong" (A_PtrSize=8 ? "Ptr":""), "Ptr", hwnd, "int", -26, "Ptr", GetClassLong | 0x20000)
if A_LastError != 0
   msgbox % "SetClassLong error:`n" GetErrorString(A_LastError)
return



GetErrorString(Errornumber)
{
	VarSetCapacity(ErrorString, 1024)		;String to hold the error-message.
	
	DllCall("FormatMessage"
			, UINT, 0x00001000			;FORMAT_MESSAGE_FROM_SYSTEM: The function should search the system message-table resource(s) for the requested message.
			, UINT, NULL					;A handle to the module that contains the message table to search.
			, UINT, Errornumber
			, UINT, 0							;Language-ID is automatically retreived
			, Str, ErrorString
			, UINT, 1024					;Buffer-Length
			, str, "")					;An array of values that are used as insert values in the formatted message. (not used)
	
	StringReplace, ErrorString, ErrorString, `r`n, %A_Space%, All		;Replaces newlines by A_Space for inline-output
	
	return %ErrorString%
}