首页 > 其他分享 >[AHK2] 取色工具

[AHK2] 取色工具

时间:2024-07-05 19:08:57浏览次数:14  
标签:AHK2 mx width 取色 hdc 工具 height my Gdip

开始

如上次所说,我抽时间完成了ahk的gdip版取色工具,如下:

image

具体代码在下节。

代码

#Requires AutoHotkey v2.0

#Include g:\AHK\git-ahk-lib\lib\gdip\GdipStarter.ahk
#Include g:\AHK\git-ahk-lib\Extend.ahk
#Include g:\AHK\git-ahk-lib\util\Cursor.ahk

CoordMode 'Mouse'
CoordMode 'Pixel'

; config
hex := true, staticG := true
offsetX := 12, offsetY := 12, width := 128, height := 128
font := "consolas", fc := '#ffdbffd5'.substring(2)

pBrush := Gdip_BrushCreateSolid(0x8f000000)
pPenLine := Gdip_CreatePen(0x44a2e9cd, 1)
pPenbkBlack := Gdip_CreatePen(0xff000000, 1)
pPenbkWhite := Gdip_CreatePen(0xffffffff, 1)

_()

_() {
  Cursor.SetIcon(Cursor.Icon.cross)
  Gdip_FontFamilyCreate(Font)

  pBitmap := Gdip_BitmapFromScreen()
    , hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
    , staticHdc := CreateCompatibleDC()
    , staticObm := SelectObject(staticHdc, hBitmap)

  gui_ := Gui('-Caption +AlwaysOnTop +ToolWindow +E0x00080000')
  gui_.Show('NA')
  global hex, flag
  Hotkey('LButton Up', Done, 'On')
  Hotkey('MButton', (*) => (flag := false, hex := !hex), 'On')
  Hotkey('RButton Up', Exit, 'On')
  Hotkey('Left', (*) => MouseMove(-1, 0, , 'R'), 'On')
  Hotkey('Right', (*) => MouseMove(1, 0, , 'R'), 'On')
  Hotkey('Up', (*) => MouseMove(0, -1, , 'R'), 'On')
  Hotkey('Down', (*) => MouseMove(0, 1, , 'R'), 'On')
  Hotkey('Esc', Exit, 'On')

  Done(*) => (A_Clipboard := hex ? g_c : Format('rgb({})', g_c), Exit())
  Exit(*) => (Clean(), ExitApp())

  SetTimer(Start, 10)

  Start() {
    static o_mX := 0, o_mY := 0
    MouseGetPos(&n_mX, &n_mY)
    if n_mX = o_mX && n_mY = o_mY && flag
      return
    flag := true, o_mX := n_mX, o_mY := n_mY
    hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
    hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
    G := Gdip_GraphicsFromHDC(hdc), Gdip_SetSmoothingMode(G, 4)
    if staticG  ; static background
      BitBlt(hdc, 0, 0, A_ScreenWidth, A_ScreenHeight, staticHdc, 0, 0)
    _DrawEnlargementfiFrame(n_mX, n_mY)
    UpdateLayeredWindow(gui_.Hwnd, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)
    SelectObject(hdc, obm) DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)

    _DrawEnlargementfiFrame(mx, my) {
      _offsetX := mx + offsetX + width > A_ScreenWidth ? -width : offsetX
      _offsetY := my + offsetY + height + 20 > A_ScreenHeight ? -height - 20 : offsetY
      _hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
      _obm := SelectObject(_hdc := CreateCompatibleDC(), _hbm), _G := Gdip_GraphicsFromHDC(_hdc)
      BitBlt(_hdc, 0, 0, A_ScreenWidth, A_ScreenHeight, staticHdc, 0, 0)
      Gdip_DrawLine(_G, pPenLine, mx, my - 1, mx, my - 10)
      Gdip_DrawLine(_G, pPenLine, mx, my + 1, mx, my + 10)
      Gdip_DrawLine(_G, pPenLine, mx - 1, my, mx - 10, my)
      Gdip_DrawLine(_G, pPenLine, mx + 1, my, mx + 10, my)
      _x := mx + _offsetX, _y := my + _offsetY, cx := _x + width // 2, cy := _y + height // 2
      StretchBlt(hdc, _x, _y, width + 2, height + 2, _hdc, mx - 9, my - 9, 19, 19 * (height // width))
      Gdip_DrawRoundedRectangle(G, pPenbkBlack, _x, _y, width + 2, height + 2, 0)
      Gdip_DrawRoundedRectangle(G, pPenbkWhite, _x + 1, _y + 1, width, height, 0)
      Gdip_DrawRoundedRectangle(G, pPenbkBlack, cx - 4, cy - 4, 9, 9, 0)
      Gdip_DrawRoundedRectangle(G, pPenbkWhite, cx - 3, cy - 3, 7, 7, 0)

      _DrawTip()
      SelectObject(_hdc, _obm), DeleteObject(_hbm), DeleteDC(_hdc), Gdip_DeleteGraphics(_G)

      _DrawTip() {
        local x := _x + 1, y := _y + height + 3
        global g_c
        Gdip_FillRoundedRectangle(G, pBrush, _x, y - 1, width + 2, 22, 0) ; background
        _c := '0xff' (hexC := PixelGetColor(Cursor.x, Cursor.y, 'slow').substring(3))
        Gdip_FillRectangle(G, _b := Gdip_BrushCreateSolid(_c), x, y, 20, 20) ; color box
        Gdip_DrawRoundedRectangle(G, pPenbkWhite, x, y, 20, 20, 0)
        options := Format('x{} y{} c{} Center s15', x + 15, y + 2, fc)
        Gdip_TextToGraphics(G, (g_c := hex ? '#' hexC : _hexToRGB(hexC)), options, font, width - 20, 30)
        Gdip_DeleteBrush(_b)

        _hexToRGB(_c) {
          local r, g, b
          if _c.length = 3
            _c := _c[0] + _c[0] + _c[1] + _c[1] + _c[2] + _c[2]
          r := ('0x' _c.substring(1, 3)) & 0xFF
          g := ('0x' _c.substring(3, 5)) & 0xFF
          b := ('0x' _c.substring(5)) & 0xFF
          return JoinStr(',', r, g, b)
        }
      }
    }
  }

  Clean() {
    ; HotKeysOff('LButton Up', 'RButton Up', 'Esc')
    SetTimer(Start, 0)
    Gdip_DeletePen(pPenLine)
    Gdip_DeletePen(pPenbkBlack), Gdip_DeleteBrush(pBrush)
    SelectObject(staticHdc, staticObm), DeleteDC(staticHdc), DeleteObject(hBitmap)
  }
}

说明

这里使用了gdi库,以及自己编写的一些扩展脚本(在仓库中)。

脚本开头是一些配置:

  • hex #xx形式或rgb()形式
  • staticG 是否显示静态背景

然后是取色显示框的偏移和大小,注意大小最好是偶数,且最好是正方形。
因为我懒了,非正方形会拉伸图像,要解决这点需要修改74行StretchBlt,前几个参数要动态计算。

最后是字体,以及画笔和笔刷的颜色,可以自由调整。

标签:AHK2,mx,width,取色,hdc,工具,height,my,Gdip
From: https://www.cnblogs.com/refiz/p/18286452

相关文章

  • Elasticsearch数据迁移工具之ESM
    Elasticsearch数据迁移工具之ESMESM版本:0.5.0上传esm的tar包并解压查看一下帮助文档并确认安装成功ESM各个参数用法简介在使用Elasticsearch的时候不可避免的会涉及到集群的升级或者是业务的迁移等场景,此时就需要对数据进行迁移,es数据迁移的工具有很多比如reindex、esm、elas......
  • AiPPT:全智能AI一键生成PPT的革命性工具
    AiPPT是一个创新的全智能AIPPT生成平台,致力于通过人工智能技术简化PPT的制作过程,为用户提供一键生成演示文稿的便捷体验。以下是该工具的一些核心特点和优势:核心特点:全流程智能生成:用户只需输入PPT主题,AiPPT即可自动生成完整的演示文稿。自动生成PPT大纲文案:结合智能文档梳......
  • 免费可视化工具来袭,制造业数据管理迈入新纪元
    制造业作为国民经济的支柱产业,正经历着前所未有的变革。数据,作为这场变革的核心驱动力,其重要性不言而喻。然而,面对海量且复杂的数据,如何高效、直观地将其转化为有价值的洞察,成为了众多制造企业亟待解决的问题。 随着技术的不断进步,一系列数据可视化工具应运而生,为制造业的智能......
  • 流程自动化软件:赋能现代企业的强大工具
    本文将介绍流程自动化软件/脚本/助手的应用场景,同时我也做个自我介绍: ......
  • Linux下R安装配置以及工具包安装方式
    安装R1.下载安装R#/home/wangwz/packages/R/R-4.3.1下载安装R4.3.1wgethttp://mirrors.ustc.edu.cn/CRAN/src/base/R-4/R-4.3.1.tar.gztar-zxvfR-4.3.1.tar.gzcdR-4.3.1#注:R-4.0以上在configure时,需要增加一个--with-pcre1参数。./configure--with-readline......
  • java List子父级集合转List树工具类
    javaList集合转Tree集合1.创建泛型工具类packagecom.demo;importorg.springframework.util.CollectionUtils;importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Map;importjava.u......
  • 2024年最佳鼠标灵敏度转换工具——“Mouse Sensitivity Converter“
    一、引言在现代的竞技游戏中,鼠标灵敏度是每个玩家都无法忽视的重要因素。无论你是FPS射击游戏达人,还是MOBA策略游戏爱好者,你都需要一款合适的鼠标灵敏度来提升你的游戏表现。然而,在不同游戏之间调整灵敏度常常让人头疼。今天我们将为大家介绍一款能够解决这一难题的神器——"Mous......
  • es库-连接工具-chrome插件:Elasticsearch-Head
    Elasticsearch-Head如何连接es数据库呢:1.下载Elasticsearch-Head插件压缩包  2.解压文件夹,是这样的: 3.打开chrome浏览器的扩展程序管理 然后,点击“加载已解压的扩展程序”: 找到并且选中你压缩es-head文件夹的根目录-》点击“选择文件夹”: 到目前就加载上es-h......
  • SQL Server 中的 DBCC(Database Console Commands)命令提供了一系列用于数据库管理和诊
    SQLServer中的DBCC(DatabaseConsoleCommands)命令提供了一系列用于数据库管理和诊断的工具和功能。以下是一些常用的DBCC命令及其功能:DBCCCHECKDB:用于检查整个数据库的物理和逻辑一致性。sqlCopyCodeDBCCCHECKDB('MyDatabase');DBCCCHECKTABLE:检查指定表......
  • iPaaS丨不同集成工具功能的重合性和相关性
    当前企业集成工具主要有三大类:iPaaS、RPA、ETL 这三大类产品,这三大集成工具之间功能均有相互的交叉和重合,企业在进行集成类业务需求实现时,很多情况下会根据开发人员个人对工具的熟悉程度来选择其中的一个工具,而不是从企业总体集成管理规范和运维成本等方面全盘考虑后再做出正确的......