10 January, 2019
Weather gadget. Accuweather
Sep 2018
Posted on AHK forum
I replaced some Windows Vista sidebar gadgets ("Network monitor", "CPU monitor","Traditional clock with alarm"), but I didn't post the weather gadget. I thought it was personalized too much and the Accuweather website layout may change in the future. Adding to that, the website sends data with different units for USA and the world (Celsius, Fahrenheit). It may be useful to post it, even though it may not work in the future (I may not be updating it).
The gadget can be easily changed and customized. I cleaned the script and removed unnecessary features.
I hope it works in different locations
I chose a few locations like: "https://www.accuweather.com/en/it/rome/ ... her/213490"
The chosen url for another location must be exactly like this one (with "/en/","/current-weather/").
I think it will work in many countries, but I didn't check this by proxy.
Weather gadget
● top left circle - toggle always on top
● double click on the title to go to the saved position
● F4 - show GUI , or click on tray icon
● more options in the right click context menu: background color; save position for next launch,
● To start not on top of other windows: enable this line #227 ;Gosub, onTop
● Accuweather forecast in popup window
● Depending on a country, data is received in Fahrenheit or Celsius degrees.
So choose units below: unit:="C" or unit:="F".
Convert Fahrenheit to Celsius with option: F_to_Celsius:=1
Drozd_Weather.ahk
▐▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▌
/*
=== Weather gadget
● top left circle - toggle always on top
● double click on the title to go to the saved position
● F4 - show GUI , or click on tray icon
● more options in the right click context menu: background color; save position for next launch,
● Accuweather forecast in popup window
● Depending on a country, data is received in Fahrenheit or Celsius degrees.
So choose units below: unit:="C" or unit:="F".
Convert Fahrenheit to Celsius with option: F_to_Celsius:=1
● To start not on top of other windows: enable this line #227 ;Gosub, onTop
*/
;==========
;weather_url:="https://www.accuweather.com/en/it/rome/213490/current-weather/213490"
;weather_url:="https://www.accuweather.com/en/pl/krakow/274455/current-weather/274455"
weather_url:="https://www.accuweather.com/en/us/new-york-ny/10007/current-weather/349727#"
;==========
;unit:="C" ; if data received in Celsius degrees (in a particular country)
unit:="F" ; if data received in Fahrenheit (in a particular country)
F_to_Celsius:=1 ; convert fahrenheit to Celsius if data received in Fahrenheit
;==========
write_ini:=1 ; stores data for 1 month
#SingleInstance force
#NoEnv
;#NoTrayIcon
Menu, Tray, Add , Weather , weather
Menu, Tray, Add ,
;Menu, Tray, Icon, shell32.dll,14 ; 47 ; ; 95 ;22
Menu, Tray, Icon, netshell.dll, 86
Menu, Tray, Add , Edit Scite, Edit_Scite
Menu, Tray, Add , Edit Notepad, Edit_Notepad
Menu, Tray, Add, Exit , Exit ; double click tray icon to exit
Menu, Tray, Default, Exit
Menu, ContextMenu, Add, On Top, OnTop
;Menu, ContextMenu, Icon, On Top, Shell32.dll, 147
Menu, ContextMenu, Icon, On Top, Shell32.dll, 248 ;wmploc.dll, 17
Menu, ContextMenu, Add, Save current position , save_position
Menu, ContextMenu, Icon, Save current position , Shell32.dll,124 ; 268 ;101 124
Menu, ContextMenu, Add,
Menu, Submenu1, Add, Black , set_bgrd_black
Menu, Submenu1, Add, Steel , set_bgrd_steel
Menu, Submenu1, Add, Blue , set_bgrd_blue
Menu, Submenu1, Add, Green , set_bgrd_green
;Menu, Submenu1, Add,
;Menu, Submenu1, Add, Funny style: dots, set_bgrd_style_dots
;Menu, Submenu1, Add, Funny style: dots 2, set_bgrd_style_dots2
;Menu, Submenu1, Add, Funny style: bricks, set_bgrd_style_bricks
;Menu, Submenu1, Add,
;Menu, Submenu1, Add, Reset background, reset_bgrd
Menu, ContextMenu, Add, Background color, :Submenu1
Menu, ContextMenu, Add,
Menu, ContextMenu, Add , Open settings file , Open_ini
Menu, ContextMenu, Icon , Open settings file , Shell32.dll, 70
;Menu, ContextMenu, Add , Open log , Open_log
Menu, ContextMenu, Add,
Menu, ContextMenu, Add , Go to website , Go_to_web
;Menu, ContextMenu, Icon , Go to website , C:\Program Files\Internet Explorer\iexplore.exe
Menu, ContextMenu, Icon , Go to website , shell32.dll, 221
Menu, ContextMenu, Add,
Menu, ContextMenu, Add , Forecast , Show_in_popup
;Menu, ContextMenu, Icon , Forecast , C:\Program Files\Internet Explorer\iexplore.exe
Menu, ContextMenu, Icon , Forecast , shell32.dll, 143 ;243
Menu, ContextMenu, Add,
Menu, ContextMenu, Add , Weather , weather
Menu, ContextMenu, Add ,
Menu, ContextMenu, Add, Restart, Reload
Menu, ContextMenu, Add, Exit, Exit
FileEncoding, UTF-8
SetWorkingDir %A_ScriptDir%
global settings_ini := "Drozd Weather.ini"
/* global log_file := "Temp\Temperatures_log_AHK.txt"
global reg_log_temp := "Temp\reg_Temp_log_AHK.txt"
IfNotExist Temp
FileCreateDir, Temp
FileAppend, Temperature log`n , %reg_log_temp%
*/
bgrd_grad_black:="0xff222222|0xff0F0F0F|33"
bgrd_grad_steel:="0xff1A2333|0xff2C3B54|33"
bgrd_grad_blue:="0xff06213D|0xff133557|33"
bgrd_grad_green:="0xff00230A|0xff044016|33"
bgrd_grad:=bgrd_grad_blue ;bgrd_grad_black
bgrd_ramki_black:="0xff353535|0xff1C1C1C"
bgrd_ramki_steel:="0xff2D3F5D|0xff1A2333"
bgrd_ramki_blue:="0xff16416B|0xff0D263E"
bgrd_ramki_green:="0xff044016|0xff00230A"
bgrd_ramki:=bgrd_grad_blue ;bgrd_ramki_black
If !pToken := Gdip_Startup(){
MsgBox, 48, No Gdiplus
ExitApp
}
OnExit, Exit
SysGet, MonitorWorkArea, MonitorWorkArea, 1
pos_x:=MonitorWorkAreaRight - 138 ;A_ScreenWidth - 138
pos_y:= MonitorWorkAreaBottom -688
IniRead, read_, %settings_ini%, Weather, weather url
if(read_="ERROR" || read_=""){
IniWrite, %weather_url% , %settings_ini%, Weather, weather url
}else{
weather_url:=read_
}
IniRead, pos_x_saved, %settings_ini%, window position, x
IniRead, pos_y_saved, %settings_ini%, window position, y
if(!pos_x_saved || !pos_y_saved || pos_x_saved=="ERROR" || pos_y_saved=="ERROR"){
IniWrite, %pos_x% , %settings_ini%, window position, x
IniWrite, %pos_y% , %settings_ini%, window position, y
}else{
if(pos_x_saved<A_ScreenWidth-120 && pos_y_saved<A_ScreenHeight-130){
pos_x:=pos_x_saved
pos_y:=pos_y_saved
}
}
IniRead, GUI_bgrd, %settings_ini%, Window, GUI_background
IniRead, GUI_ramka, %settings_ini%, Window, GUI_ramka
if(GUI_bgrd!="ERROR" && GUI_bgrd!="" && GUI_ramka!="ERROR" && GUI_ramka!=""){
bgrd_grad:=GUI_bgrd
bgrd_ramki:=GUI_ramka
}else{
IniWrite, %bgrd_grad% , %settings_ini%, Window, GUI_background
IniWrite, %bgrd_ramki% , %settings_ini%, Window, GUI_ramka
}
Gui,1: +ToolWindow -caption +AlwaysOnTop +HwndGuiHwnd ;caption
Gui,1:Color, 120F00
Gui,1: -DPIScale
WonTop:=1
; bgrd:
Gui, 1: Add, Picture, x0 y0 w135 h66 vbgrd BackgroundTrans 0xE,
Gdip_Set_bgrd(bgrd,bgrd_grad)
Gui, 1: Add, Picture, x0 y0 w134 h13 vramkaT 0xE,
Gdip_Set_bgrd(ramkaT,bgrd_ramki_black "|6")
Gui, Add, Picture, x3 y19 w53 h31 vramka 0xE,
Gui, Add, Picture, x60 y19 w72 h15 vramka1 0xE,
Gui, Add, Picture, x60 y35 w72 h15 vramka2 0xE,
GoSub, ramka
; ramka:
Gui,1: Font, S7 w700 cD0D0D0 , Segoe UI ;
Gui,1: Add, Text , x122 y0 w10 h10 cD0D0D0 gexit BackgroundTrans Center , X
Gui,1: Font, S6 w700 c9C9C9C , Segoe UI
Gui,1: Add, Text , x4 y0 c676767 vonTop_off gonTop BackgroundTrans, % Chr(9675) ; ○
Gui,1: Font, S9
Gui,1: Add, Text , x4 y+-13 c676767 vonTop_on gonTop BackgroundTrans, % Chr(9679) ; ●
GuiControl, Hide, onTop_off
Gui,1: Font, S7 w700 cE1E1E1 , Segoe UI ; Tahoma
Gui,1: Add, Text , x18 y0 w100 vtitle gDoubleClick BackgroundTrans Center, Accuweather ;Drozd weather ; gGoToSavedPos
Gui,1: Font, S15 w700 cE1E1E1 , Segoe UI
Gui,1: Add, Text , x3 y19 w50 vTem gweather BackgroundTrans Center, --
Gui,1: Font, S8 w700 cE1E1E1 ,
Gui,1: Font, S7 w400
Gui,1: Add, Text , x0 y51 w76 vCon gDoubleClick +HwndConID BackgroundTrans Center,
Gui,1: Font, S7 w700 cD2D2D2, Arial
Gui,1: Add, Text, x78 y52 w56 vlast_check gDoubleClick +Hwndlast_checkID BackgroundTrans Center,
;GuiControl, Hide, last_check
Gui,1: Font, S7 w700
Gui,1: Add, Text , x60 y21 w27 cE9C45D vHum Center BackgroundTrans , --
Gui,1: Add, Text , x60 y37 w27 cE9C45D vDew Center BackgroundTrans , --
Gui,1: Font, S7 w400
Gui,1: Add, Text , x88 y21 cD8C591 w42 BackgroundTrans, Humidity
Gui,1: Add, Text , x88 y37 cD8C591 w42 BackgroundTrans, Dew point
;Gui,1: Add, Picture, x115 y51 w16 h16 BackgroundTrans Icon249 AltSubmit, shell32.dll ;
;Gui,1: Add, Picture, x112 y128 w16 h16 Icon249 AltSubmit, shell32.dll ;
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x404, "AHK_NOTIFYICON")
OnMessage(0x200, "WM_MOUSEMOVE")
Gui, 1: Show, Hide x%pos_x% y%pos_y% w134 h66 , Drozd_weather
;DllCall( "AnimateWindow", "Int", GuiHwnd, "Int", 300, "Int", 0x00000010 )
DllCall( "AnimateWindow", "Int", GuiHwnd, "Int", 300, "Int", 0x00000004 )
;Winset, Transparent,200, Drozd_weather
WinSet, Style, -0xC00000, Drozd_weather ; COMPLETELY remove window border
;Gosub, onTop
GoSub, start_weather
SetTimer,clear_memory, % 6*60*60*1000
return
AHK_NOTIFYICON(wParam, lParam){ ;click tray icon to show
if (lParam = 0x202) { ; WM_LBUTTONUP
Gui,1:Show
}else if (lParam = 0x203){ ; WM_LBUTTONDBLCLK
}
}
WM_LBUTTONDOWN(){
if(A_Gui=1){
PostMessage, 0xA1, 2 ; movable borderless window
ToolTip_("", 0.5)
}
}
;===================
WM_MOUSEMOVE(){
global GuiHwnd, tray_tip, tipOn, ConID, last_checkID
MouseGetPos,, ,winID,control , 3 ; hwnd
if(winID==GuiHwnd){
GuiControl, Show, last_check
SetTimer, hide_time, -6000
if(control==ConID && tipOn!=1){
tipOn:=1
;ToolTipFont("s11 w700", "Segoe UI")
ToolTipFont("s10", "Segoe UI Semibold")
ToolTipColor("F2EEDC", "900000")
ToolTip_(tray_tip, 3)
}else if(control==last_checkID && tipOn!=2){
tipOn:=2
ToolTipFont("s9", "Segoe UI")
ToolTipColor("FFFFFF","333333")
ToolTip_("` last checked ", 1)
}
}
}
;======================================
start_weather:
GoSub, weather
SetTimer, weather, % 30*60*1000 ; 0.5h
del_last_month()
return
weather:
Gosub, weather_get
Gosub, write_
return
weather_get:
if !InternetConnection(){
SetTimer, check_again, -60000
return
}
;GuiControlGet,t1,1:, last_check
GuiControl,, last_check,
GuiControl,, last_check, connecting
Contents:=DownloadToString(weather_url)
;MsgBox,,, % Contents
RegExMatch(Contents,"im)<div id=""detail-now""[\s\S]*<div id=""feature-history"">", today )
;MsgBox,,, % today
RegExMatch(today,"im)<li>Dew Point: <strong>(\d+)° F",dew )
RegExMatch(today,"im)<th scope=""row"">Now</th>\s*<td>(\d+)°</td>",temper )
RegExMatch(today,"im)<div id=""detail-now"" class=""detail-tab-panel day""[\s\S]*<span class=""cond"">(.*?)</span>",cond )
RegExMatch(today,"im)<li>Humidity: <strong>(\d+%)</strong>",Humid )
RegExMatch(today,"im)<div id=""detail-now""[\s\S]*<span class=""cond"">(.*?)</span>",cond )
RegExMatch(today,"im)<th scope=""row"">Yesterday</th>\s*<td>(\d+)°</td>",yesterday )
if !today ; fix NYC Feb4 2019
{
RegExMatch(Contents,"im)<div class=""conditions-wrapper day"">[\s\S]*<div id=""trending-now""", today )
if !today
RegExMatch(Contents,"im)<ul id=""detail-tab-buttons"" class=""block-tabs"">[\s\S]*<div id=""trending-now""", today )
;MsgBox,4096,, % "`n" today
RegExMatch(today,"im)<div class=""hi"">(\d+)°</div>",temper )
RegExMatch(today,"im)<div>Dew Point: (\d+)°? F</div>",dew )
RegExMatch(today,"im)<div class=""phrase"">(.*?)</div>",cond )
RegExMatch(today,"im)<div>Humidity: (\d+%)</div>",Humid )
RegExMatch(today,"im)<th scope=""row"">Yesterday</th>\s*<td>(\d+)°</td>",yesterday )
;MsgBox,4096,, % "temp=" temper1 "`ndew=" dew1 "`n" cond1 "`n" Humid1 "`n" yesterday1
;MsgBox,,, % today
}
tem:=temper1
if tem is not integer
{
;MsgBox,,Drozd Weather, % "Temperature read error.`nWill check again in 1 min." , 1
Gosub, popupGUI
SetTimer, check_again, % 1*60*1000
return
}
dew:=dew1
yester:=yesterday1
if(F_to_Celsius){
tem:=f_C(tem) Chr(176) "C" ;"°C"
dew:=f_C(dew) Chr(176) "C" ;"°C"
yester:=f_C(yester) Chr(176) "C" ;"°C"
}else{
tem:=tem Chr(176) unit ;"°"
dew:=dew Chr(176) unit ;"°"
yester:=yester Chr(176) unit ;"°"
}
hum:=Humid1
last_temp:=tem
strT:=" Temperature: " tem " "
strD:=" Dew point: " dew " "
strH:=" Humidity: " Humid1 " "
strY:=" Yesterday: " yester
tray_tip:=" " cond1 "`n" strT "`n" strD "`n" strH "`n" strY
strT_:=" Temperature: " tem " (" temper1 "F)" " "
strD_:=" Dew point: " dew " (" dew1 "F)" " "
strH_:=" Humidity: " Humid1 " "
strY_:=" Yesterday: " yester " (" yesterday1 "F)"
tray_tipC_F:=" " cond1 "`n" strT_ "`n" strD_ "`n" strH_ "`n" strY_
tray_tip:=(F_to_Celsius==1) ? tray_tipC_F : tray_tip
GuiControl,, Tem, %tem%
GuiControl,, Hum, %hum%
GuiControl,, Dew, %dew%
GuiControl,, Con, %cond1%
FormatTime, date, %A_Now%, HH:mm ;MMMd
GuiControl,, last_check, %date%
SetTimer, hide_time, -3000
return
write_:
if(write_ini!=1)
return
IniRead, today_1, %settings_ini%, % A_MM " " A_YYYY , % A_MMM A_DD
IniRead, reg_log_, %settings_ini%, % A_MM " " A_YYYY , % A_MMM A_DD
reg_log_:=(reg_log_=="ERROR") ? "" : reg_log_ " | "
reg_log:= A_Hour "h " tem
reg_log:=reg_log_ reg_log
if !InStr(reg_log_,A_Hour "h")
IniWrite, %reg_log% , %settings_ini%, % A_MM " " A_YYYY, % A_MMM A_DD
return
hide_time:
SetTimer, hide_time, Off
GuiControl, Hide, last_check
return
check_again:
Gosub, weather
return
popupGUI:
Gui,4: Destroy
Gui,4:+Owner1
Gui,4:+ToolWindow -Caption
Gui,4:Color, 700000
Gui,4: Font, S7 w700 cE1E1E1 Q5, Verdana ;Arial ;Segoe UI Semibold
;Gui,4: Add, Text, x3 y8 w128 ,% "Temperature read error. `nWill check again in 1 min."
;Gui,4:+Parent%GuiHwnd%
;MsgBox,4096,, % pos_x "`n" pos_y
Gui,4: Add, Text, x3 y6 w128 ,% "Temperature read error. `nWill check again in 1 min."
pos_x4:= pos_x, pos_y4:=pos_y+13
Gui, 4:Show, x%pos_x4% y%pos_y4% w134 h38 , Drozd_popupGUI
SetTimer, Dest_popupGUI, -3000
return
Dest_popupGUI:
Gui,4: Destroy
return
f_C(t,d:=0){ ;(°F - 32) x 5/9 = °C ;fahrenheit_to_celsius
t:= (t-32)*(5/9)
t:=Round(t,d)
return t
}
;======================
del_last_month(){
global reg_log_temp
prev_m:= (A_MM!=01) ? dig(A_MM - 1) " " A_YYYY : 12 " " A_YYYY-1
IniRead, prev_month , %settings_ini%, % prev_m
if(prev_month!=""){
if FileExist(reg_log_temp){
FileAppend, `n%prev_m%`n , %reg_log_temp%
FileAppend, %prev_month%`n , %reg_log_temp%
}
IniDelete, %settings_ini%, %prev_m%
}
; leftovers
Loop % A_MM-1 {
prev_m:=dig(A_MM-A_Index) " " A_YYYY
IniRead, prev_month , %settings_ini%, % prev_m
if(prev_month!=""){
IniDelete, %settings_ini%, %prev_m%
}
}
}
dig(num){ ;to_two_digits
num:= num<=9 ? "0" . num : num
return num
}
;============================================
Show_in_popup:
HTML_page:=DownloadToString(weather_url)
if(F_to_Celsius){
Gosub, change_FtoC
if(RegExMatch(HTML_page,"i)<li>Ceiling: <strong>(\d+) ft<",match)){
match:=RegExReplace(match,match1 " ft",feet_to_m(match1))
HTML_page:=RegExReplace(HTML_page,"im)<li>Ceiling: <strong>(\d+) ft<", match)
}
if(RegExMatch(HTML_page,"i)<li>Visibility: <strong>(\d+) mi", match)){
match:=RegExReplace(match,match1 " mi", mile_to_km(match1))
HTML_page:=RegExReplace(HTML_page,"im)<li>Visibility: <strong>(\d+) mi", match)
}
if(RegExMatch(HTML_page,"i)<li class=""wind""><strong>(\d+) mph<",match)){
match:=RegExReplace(match,match1 " mph",mile_to_km(match1) "/h")
HTML_page:=RegExReplace(HTML_page,"im)<li class=""wind""><strong>(\d+) mph<", match)
}
}
RegExMatch(HTML_page,"im)<link rel=""stylesheet"" href=""(.+)?"" type=""text/css""",css)
urlCSS:=css1
;RegExMatch(HTML_page,"im)<!-- /.feed-controls -->\s+(<div id=""feed-tabs"" class=""panel-list"">[\s\S]*Next 5 Days[\s\S]*)<div class=""rise-modules"">",Next_5_Days)
RegExMatch(HTML_page,"ims)<!-- /.feed-controls -->\s+(<div id=""feed-tabs"" class=""panel-list"">.*Next 5 Days.*?)(?=<div class=""panel-body-content"">)",Next_5_Days)
HTML_page1 =
( comments
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><meta http-equiv="X-UA-Compatible" content="IE=Edge"></head>
<style></style>
<title>Forecast</title>
</head>
<body><center> ;<h1> TEST </h1>
)
HTML_page:= HTML_page1 Next_5_Days1 "<a href='" weather_url "'>" weather_url "</a><br>" "</center></body></html>"
;urlCSS:="https://vortex.accuweather.com/adc2010/stylesheets/slate.min-20180522-1001.css"
addCSS:= "<link rel=""stylesheet"" type=""text/css"" href=""" urlCSS """ />"
HTML_page:=RegExReplace(HTML_page,"im)<\/head>", addCSS "</head>")
w:=700 , h:=710
;w:=560 , h:=700
Gui,4: Add, ActiveX, vWB w%w% h%h% +Resize +VScroll +HScroll, about:<!DOCTYPE html><meta http-equiv="X-UA-Compatible" content="IE=edge">
WB.silent := true
document := WB.Document
document.open()
document.write(HTML_page)
document.close()
;WB.Document.Body.Style.Zoom := "80%"
Gui,4: +HWNDWin_id
;Gui,4: +Owner1 +AlwaysOnTop
Gui,4: Show,% "w" w+20 " h" h+10, IE ActiveX
match:= document:= HTML_page:=""
return
4GuiClose:
Gui,4: Destroy
return
change_FtoC:
HTML_page:=RegExReplace(HTML_page,"im)<\/head>", addCSS "</head>")
HTML_page2:=HTML_page
RegExMatch(HTML_page2,"im)(\d\d)°(?C1:Replacer)")
HTML_page:=RegExReplace(HTML_page,"im)°(?:F(?!\)))?","")
HTML_page2:=""
if(RegExMatch(HTML_page,"i)<li>Dew Point: <strong>(\d+)° F<",match)){
match:=RegExReplace(match,match1 ,f_C(match1))
match:=RegExReplace(match,"F<","C<")
HTML_page:=RegExReplace(HTML_page,"im)<li>Dew Point: <strong>(\d+)° F<", match)
}
HTML_page:=RegExReplace(HTML_page,"im)<li>Dew Point: <strong>(\d+)° F<", match)
return
Replacer(match,1,pos){
global HTML_page
repl:=f_C(match1) "°"
HTML_page:=RegExReplace(HTML_page,"im)" match1,repl,,1,pos)
return 1
}
mile_to_km(mi){
return Round(mi*1.60934) " km"
}
feet_to_m(leg){
return Round(leg* 0.3048) " m"
}
;============================================
;======================
InternetConnection(flag:=0x40) {
return DllCall("Wininet.dll\InternetGetConnectedState", "Str", flag,"Int",0)
}
;======================
DownloadToString(url, encoding="utf-8"){ ;https://autohotkey.com/board/topic/89198-simple-download-bin-tostring-und-tofile/ Bentschi
static a := "AutoHotkey/" A_AhkVersion
if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
return 0
c := s := 0, o := ""
if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
{
while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
{
VarSetCapacity(b, s, 0)
DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
o .= StrGet(&b, r>>(encoding="utf-16"||encoding="cp1200"), encoding)
}
DllCall("wininet\InternetCloseHandle", "ptr", f)
}
DllCall("wininet\InternetCloseHandle", "ptr", h)
return o
}
DownloadToFile(url, filename){
static a := "AutoHotkey/" A_AhkVersion
if (!(o := FileOpen(filename, "w")) || !DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
return 0
c := s := 0
if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
{
while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
{
VarSetCapacity(b, s, 0)
DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
c += r
o.rawWrite(b, r)
}
DllCall("wininet\InternetCloseHandle", "ptr", f)
}
DllCall("wininet\InternetCloseHandle", "ptr", h)
o.close()
return c
}
;=============================
ramka: ;bgrd:
Gdip_Set_bgrd(ramka,bgrd_ramki "|15",,0)
Gdip_Set_bgrd(ramka2,bgrd_ramki "|7",,0)
Gdip_Set_bgrd(ramka1,bgrd_ramki "|7",,0)
return
Gdip_Set_bgrd(ByRef Variable, Background=0x00000000,Hatch=0,border=0){
GuiControlGet, Pos, Pos, Variable
GuiControlGet, hwnd, hwnd, Variable
pBitmap := Gdip_CreateBitmap(Posw, Posh), G := Gdip_GraphicsFromImage(pBitmap), Gdip_SetSmoothingMode(G, 4)
Background_:=StrSplit(Background,"|")
if(Background_.Length() >1){
;=== with gradient =====
;pBrushFront := Gdip_CreateLineBrushFromRect(0, 0, 1, 10, grad_color1, grad_color2 ,1)
grad_color_rim:=Background_[1]
grad_color_mid:=Background_[2]
size:=Background_[3]
if(Hatch=0){
pBrushFront := Gdip_CreateLineBrushFromRect(0, 0, 1, size, grad_color_rim, grad_color_mid ,1)
}else{
pBrushFront :=Gdip_BrushCreateHatch(grad_color_rim, grad_color_mid, Hatch) ; kropki
}
Gdip_FillRectangle(G, pBrushFront,-1, -1, PosW+1, Posh+1)
;========
}else{
pBrushBack := Gdip_BrushCreateSolid(Background)
Gdip_FillRectangle(G, pBrushBack, 0, 0, PosW, Posh)
}
if(border==1){
pPen:=Gdip_CreatePen(0xff111111, 1)
Gdip_DrawRectangle(G, pPen,0, 0, PosW-1, Posh-1)
;Gdip_DrawRoundedRectangle(G, pPen,0, 0, PosW-1, Posh-1,4)
}
hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
SetImage(hwnd, hBitmap)
Gdip_DeleteBrush(pBrushFront), Gdip_DeleteBrush(pBrushBack)
Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), DeleteObject(hBitmap)
Return, 0
}
;=========================================
set_bgrd_black:
IniWrite, %bgrd_grad_black% , %settings_ini%, Window, GUI_background
IniWrite, %bgrd_ramki_black% , %settings_ini%, Window, GUI_ramka
return
set_bgrd_steel:
IniWrite, %bgrd_grad_steel% , %settings_ini%, Window, GUI_background
IniWrite, %bgrd_ramki_steel% , %settings_ini%, Window, GUI_ramka
return
set_bgrd_blue:
IniWrite, %bgrd_grad_blue% , %settings_ini%, Window, GUI_background
IniWrite, %bgrd_ramki_blue% , %settings_ini%, Window, GUI_ramka
return
set_bgrd_green:
IniWrite, %bgrd_grad_green% , %settings_ini%, Window, GUI_background
IniWrite, %bgrd_ramki_green% , %settings_ini%, Window, GUI_ramka
return
;=========================================
save_position:
WinGetPos, x1,y1,,, ahk_id %GuiHwnd%
IniWrite, %x1% , %settings_ini%, window position, x
IniWrite, %y1% , %settings_ini%, window position, y
return
Open_ini:
Run, %settings_ini%
return
Open_log:
;Run, %log_file%
return
Go_to_web:
Run, %weather_url%
return
Open_log2:
if(A_GuiEvent == "DoubleClick")
Run, %log_file%
return
Open_ini2:
if(A_GuiEvent == "DoubleClick")
Run, %settings_ini%
return
;=========================================
onTop:
WonTop:=!WonTop
if WonTop {
WinSet, AlwaysOnTop, on, Drozd_weather
GuiControl, Show, onTop_on
GuiControl, Hide, onTop_off
}else{
WinSet, AlwaysOnTop, off, Drozd_weather
GuiControl, Show, onTop_off
GuiControl, Hide, onTop_on
}
return
GoToSavedPos: ; DoubleClick
IniRead, pos_x_saved, %settings_ini%, window position, x
IniRead, pos_y_saved, %settings_ini%, window position, y
if(pos_x_saved<A_ScreenWidth-120 && pos_y_saved<A_ScreenHeight-140)
WinMove, Drozd_weather, ,pos_x_saved,pos_y_saved
return
DoubleClick:
return
DisableWindowsFeature(){ ; prevent copy to clipboard when double clicked ;autohotkey.com/boards/viewtopic.php?t=3569
Static Dummy1 := OnMessage(0x00A3, "DisableWindowsFeature") ; WM_NCLBUTTONDBLCLK
Static Dummy2 := OnMessage(0x0203, "DisableWindowsFeature") ; WM_LBUTTONDBLCLK
If (A_GuiControl) {
GuiControlGet, HCTRL, Hwnd, %A_GuiControl%
WinGetClass, Class, ahk_id %HCTRL%
If (Class = "Static")
if (A_GuiControl= "Con"){
Gosub, Open_ini
}else if (A_GuiControl= "last_check"){
Gosub, Open_log
}else if (A_GuiControl= "title"){
Gosub, GoToSavedPos
}
Return 0
}
}
;============================================
ToolTip_(tekst,t:=2,screen:=0){
if(screen){
CoordMode, ToolTip,Screen
if(screen==1){
ToolTip, %tekst% ,600, 350
}else{
ToolTip, %tekst% ;,600, 350
}
}else{
CoordMode , ToolTip, Relative
GuiControlGet, Pos, Pos, edit_1
tipX:= PosX+ 4, tipY:=PosY +2
ToolTip, %tekst% ,%tipX%, %tipY%
}
t:=t*1000
Settimer, ToolTip_close , -%t%
}
ToolTip_close:
Settimer, ToolTip_close , Off
tipOn:=0
ToolTip
return
;=========================================
clear_memory:
EmptyMem(PID)
return
EmptyMem(PID:=0){ ;by heresy https://autohotkey.com/board/topic/30042-run-ahk-scripts-with-less-half-or-even-less-memory-usage/
PID:=(PID) ? PID : DllCall("GetCurrentProcessId")
h:=DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
DllCall("SetProcessWorkingSetSize", "UInt", h, "Int", -1, "Int", -1)
DllCall("CloseHandle", "Int", h)
}
;======================================
;~^g:: Gosub, test
test:
return
GuiContextMenu:
Menu, ContextMenu, Show, %A_GuiX%, %A_GuiY%
Return
~$F4::
Gui 1: Show
return
WindowSpy:
Run, "C:\Program Files\AutoHotkey\AU3_Spy.exe" ;"C:\Program Files\AutoHotkey\WindowSpy.ahk"
WinWait, ahk_exe AU3_Spy.exe , , 3
WinMove, Active Window Info, , 1100
return
Reload:
Reload
return
Edit_Notepad:
Run, "C:\Program Files\Misc\Notepad2\Notepad2.exe" "%A_ScriptFullPath%"
return
Edit_Scite:
Run, "C:\Program Files\AutoHotkey\SciTE\SciTE.exe" "%A_ScriptFullPath%"
return
Close:
;Esc::
GuiClose:
Exit:
Gdip_Shutdown(pToken)
DllCall( "AnimateWindow", "Int", GuiHwnd, "Int", 300, "Int", 0x00050008 )
ExitApp
;#Include C:\Program Files\Misc\AutoHotkey Scripts\functions_Gdip.ahk
Gdip_Startup()
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
if !DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
DllCall("LoadLibrary", "str", "gdiplus")
VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", A_PtrSize ? "UPtr*" : "uint*", pToken, Ptr, &si, Ptr, 0)
return pToken
}
Gdip_Shutdown(pToken)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
DllCall("gdiplus\GdiplusShutdown", Ptr, pToken)
if hModule := DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
DllCall("FreeLibrary", Ptr, hModule)
return 0
}
SetImage(hwnd, hBitmap)
{
SendMessage, 0x172, 0x0, hBitmap,, ahk_id %hwnd%
E := ErrorLevel
DeleteObject(E)
return E
}
Gdip_BitmapFromHWND(hwnd)
{
WinGetPos,,, Width, Height, ahk_id %hwnd%
hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
PrintWindow(hwnd, hdc)
pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
return pBitmap
}
Gdip_CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
{
DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "uint", pBitmap, "uint*", hbm, "int", Background)
return hbm
}
CreateCompatibleDC(hdc=0)
{
return DllCall("CreateCompatibleDC", "uint", hdc)
}
SelectObject(hdc, hgdiobj)
{
return DllCall("SelectObject", "uint", hdc, "uint", hgdiobj)
}
CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
hdc2 := hdc ? hdc : GetDC()
VarSetCapacity(bi, 40, 0)
NumPut(w, bi, 4, "uint")
, NumPut(h, bi, 8, "uint")
, NumPut(40, bi, 0, "uint")
, NumPut(1, bi, 12, "ushort")
, NumPut(0, bi, 16, "uInt")
, NumPut(bpp, bi, 14, "ushort")
hbm := DllCall("CreateDIBSection"
, Ptr, hdc2
, Ptr, &bi
, "uint", 0
, A_PtrSize ? "UPtr*" : "uint*", ppvBits
, Ptr, 0
, "uint", 0, Ptr)
if !hdc
ReleaseDC(hdc2)
return hbm
}
Gdip_SetSmoothingMode(pGraphics, SmoothingMode)
{
return DllCall("gdiplus\GdipSetSmoothingMode", "uint", pGraphics, "int", SmoothingMode)
}
Gdip_CreatePen(ARGB, w)
{
DllCall("gdiplus\GdipCreatePen1", "int", ARGB, "float", w, "int", 2, "uint*", pPen)
return pPen
}
Gdip_CloneBrush(pBrush)
{
DllCall("gdiplus\GdipCloneBrush", "uint", pBrush, "uint*", pBrushClone)
return pBrushClone
}
Gdip_BrushCreateSolid(ARGB=0xff000000)
{
DllCall("gdiplus\GdipCreateSolidFill", "int", ARGB, "uint*", pBrush)
return pBrush
}
Gdip_CreateLineBrushFromRect(x, y, w, h, ARGB1, ARGB2, LinearGradientMode=1, WrapMode=1)
{
CreateRectF(RectF, x, y, w, h)
DllCall("gdiplus\GdipCreateLineBrushFromRect", "uint", &RectF, "int", ARGB1, "int", ARGB2, "int", LinearGradientMode, "int", WrapMode, "uint*", LGpBrush)
return LGpBrush
}
Gdip_DeletePath(Path)
{
return DllCall("gdiplus\GdipDeletePath", "uint", Path)
}
PrintWindow(hwnd, hdc, Flags=0)
{
return DllCall("PrintWindow", "uint", hwnd, "uint", hdc, "uint", Flags)
}
Gdip_CreateBitmapFromHBITMAP(hBitmap, Palette=0)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBitmap, Ptr, Palette, A_PtrSize ? "UPtr*" : "uint*", pBitmap)
return pBitmap
}
Gdip_GetDC(pGraphics)
{
DllCall("gdiplus\GdipGetDC", "uint", pGraphics, "uint*", hdc)
return hdc
}
GetDC(hwnd=0)
{
return DllCall("GetDC", "uint", hwnd)
}
DeleteObject(hObject)
{
return DllCall("DeleteObject", "uint", hObject)
}
DeleteDC(hdc)
{
return DllCall("DeleteDC", "uint", hdc)
}
ReleaseDC(hdc, hwnd=0)
{
return DllCall("ReleaseDC", "uint", hwnd, "uint", hdc)
}
CreateRectF(ByRef RectF, x, y, w, h)
{
VarSetCapacity(RectF, 16)
NumPut(x, RectF, 0, "float"), NumPut(y, RectF, 4, "float"), NumPut(w, RectF, 8, "float"), NumPut(h, RectF, 12, "float")
}
Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
{
return DllCall("gdiplus\GdipDrawRectangle", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h)
}
Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
{
return DllCall("gdiplus\GdipFillRectangle", "uint", pGraphics, "int", pBrush
, "float", x, "float", y, "float", w, "float", h)
}
Gdip_GraphicsFromImage(pBitmap)
{
DllCall("gdiplus\GdipGetImageGraphicsContext", "uint", pBitmap, "uint*", pGraphics)
return pGraphics
}
Gdip_CreateBitmap(Width, Height, Format=0x26200A)
{
DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", 0, "int", Format, "uint", 0, "uint*", pBitmap)
Return pBitmap
}
Gdip_DeletePen(pPen)
{
return DllCall("gdiplus\GdipDeletePen", "uint", pPen)
}
Gdip_DeleteBrush(pBrush)
{
return DllCall("gdiplus\GdipDeleteBrush", "uint", pBrush)
}
Gdip_DisposeImage(pBitmap)
{
return DllCall("gdiplus\GdipDisposeImage", "uint", pBitmap)
}
Gdip_DeleteGraphics(pGraphics)
{
return DllCall("gdiplus\GdipDeleteGraphics", "uint", pGraphics)
}
Gdip_SaveBitmapToFile(pBitmap, sOutput, Quality=75)
{
Ptr := A_PtrSize ? "UPtr" : "UInt"
SplitPath, sOutput,,, Extension
if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
return -1
Extension := "." Extension
DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
VarSetCapacity(ci, nSize)
DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, Ptr, &ci)
if !(nCount && nSize)
return -2
If (A_IsUnicode){
StrGet_Name := "StrGet"
Loop, %nCount%
{
sString := %StrGet_Name%(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
if !InStr(sString, "*" Extension)
continue
pCodec := &ci+idx
break
}
} else {
Loop, %nCount%
{
Location := NumGet(ci, 76*(A_Index-1)+44)
nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int", 0, "uint", 0, "uint", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "str", sString, "int", nSize, "uint", 0, "uint", 0)
if !InStr(sString, "*" Extension)
continue
pCodec := &ci+76*(A_Index-1)
break
}
}
if !pCodec
return -3
if (Quality != 75)
{
Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
if Extension in .JPG,.JPEG,.JPE,.JFIF
{
DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, "uint*", nSize)
VarSetCapacity(EncoderParameters, nSize, 0)
DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, "uint", nSize, Ptr, &EncoderParameters)
Loop, % NumGet(EncoderParameters, "UInt") ;%
{
elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)
{
p := elem+&EncoderParameters-pad-4
NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
break
}
}
}
}
if (!A_IsUnicode)
{
nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, 0, "int", 0)
VarSetCapacity(wOutput, nSize*2)
DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, &wOutput, "int", nSize)
VarSetCapacity(wOutput, -1)
if !VarSetCapacity(wOutput)
return -4
E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &wOutput, Ptr, pCodec, "uint", p ? p : 0)
}
else
E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &sOutput, Ptr, pCodec, "uint", p ? p : 0)
return E ? -5 : 0
}
Gdip_BrushCreateHatch(ARGBfront, ARGBback, HatchStyle=0)
{
DllCall("gdiplus\GdipCreateHatchBrush", "int", HatchStyle, "UInt", ARGBfront, "UInt", ARGBback, A_PtrSize ? "UPtr*" : "UInt*", pBrush)
return pBrush
}
;================================
ToolTipFont(Options := "", Name := "", hwnd := ""){ ;lexikos https://autohotkey.com/boards/viewtopic.php?t=4777
static hfont := 0
if (hwnd = "")
hfont := Options="Default" ? 0 : _TTG("Font", Options, Name), _TTHook()
else
DllCall("SendMessage", "ptr", hwnd, "uint", 0x30, "ptr", hfont, "ptr", 0)
}
ToolTipColor(Background := "", Text := "", hwnd := ""){
static bc := "", tc := ""
if (hwnd = "") {
if (Background != "")
bc := Background="Default" ? "" : _TTG("Color", Background)
if (Text != "")
tc := Text="Default" ? "" : _TTG("Color", Text)
_TTHook()
}
else {
VarSetCapacity(empty, 2, 0)
DllCall("UxTheme.dll\SetWindowTheme", "ptr", hwnd, "ptr", 0
, "ptr", (bc != "" && tc != "") ? &empty : 0)
if (bc != "")
DllCall("SendMessage", "ptr", hwnd, "uint", 1043, "ptr", bc, "ptr", 0)
if (tc != "")
DllCall("SendMessage", "ptr", hwnd, "uint", 1044, "ptr", tc, "ptr", 0)
}
}
_TTHook(){
static hook := 0
if !hook
hook := DllCall("SetWindowsHookExW", "int", 4
, "ptr", RegisterCallback("_TTWndProc"), "ptr", 0
, "uint", DllCall("GetCurrentThreadId"), "ptr")
}
_TTWndProc(nCode, _wp, _lp) {
Critical 999
;lParam := NumGet(_lp+0*A_PtrSize)
;wParam := NumGet(_lp+1*A_PtrSize)
uMsg := NumGet(_lp+2*A_PtrSize, "uint")
hwnd := NumGet(_lp+3*A_PtrSize)
if (nCode >= 0 && (uMsg = 1081 || uMsg = 1036)) {
_hack_ = ahk_id %hwnd%
WinGetClass wclass, %_hack_%
if (wclass = "tooltips_class32") {
ToolTipColor(,, hwnd)
ToolTipFont(,, hwnd)
}
}
return DllCall("CallNextHookEx", "ptr", 0, "int", nCode, "ptr", _wp, "ptr", _lp, "ptr")
}
_TTG(Cmd, Arg1, Arg2 := "") {
static htext := 0, hgui := 0
if !htext {
Gui _TTG: Add, Text, +hwndhtext
Gui _TTG: +hwndhgui +0x40000000
}
Gui _TTG: %Cmd%, %Arg1%, %Arg2%
if (Cmd = "Font") {
GuiControl _TTG: Font, %htext%
SendMessage 0x31, 0, 0,, ahk_id %htext%
return ErrorLevel
}
if (Cmd = "Color") {
hdc := DllCall("GetDC", "ptr", htext, "ptr")
SendMessage 0x138, hdc, htext,, ahk_id %hgui%
clr := DllCall("GetBkColor", "ptr", hdc, "uint")
DllCall("ReleaseDC", "ptr", htext, "ptr", hdc)
return clr
}
}
;==================================
▐▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▌
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment