AHK获取微信联系人

AHK获取微信联系人
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;作者:Kawvin大神;修改:Space
;更新于:2017-12-30-21-45
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Process, Priority,,high			;脚本高优先级#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#NoTrayIcon 						;隐藏托盘图标
#SingleInstance force              ;单脚本运行
;~ #Warn All, Off
OnExit, OnExit
SendMode Input  					;Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%		;设置工作目录
SetTitleMatchMode,2				;设置WinWait等命令,匹配包含指定的 WinTitle 的窗口标题,精确匹配
ComObjError(0)						;禁用  COM 错误通告
SetBatchLines -1
CoordMode, mouse, Client

global flag := 1
global MyINI:=A_ScriptDir . "\微信常用联系人列表.ini"
global MyWeRecArray:={}
IniRead,MyWeChatTo,%MyINI%,微信收件人
StringReplace,MyWeChatTo,MyWeChatTo,`n,|,All
MyWeRecArray:=StrSplit(MyWeChatTo,"|")
global bgDir:=A_ScriptDir "\bing"
IfNotExist, %MyINI%
	FileAppend,  ; 这里需要逗号.
(
[通用设置]
微信发送热键=!w
微信路径=D:\Program Files\Internet\Tencent\WeChat\WeChat.exe
原始X坐标=376
原始Y坐标=115
原始宽度=1075
原始高度=811

[微信收件人]
--[家庭]--
爸爸
妈妈
哥哥

--[工作]--
李大新
路文文

--[供应商]--
江大联盛胡瑛
长沙天骄陈总

--[朋友]--
李平
李红钢
), %MyINI%
;~ SetTimer, checks, on, 500
return

GetPID(exe){			;一个自定义函数,根据自定义函数的返回值作为#if成立依据
Process, Exist,% exe
return ErrorLevel
}

F22::
~!w::			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;请把微信快捷键设置为alt+w
	gosub  DOCKED
return
	
#If flag=1
~^!w::
	if GetPID("WeChat.exe")=0
	{
		Run, D:\Program Files\Internet\Tencent\WeChat\WeChat.exe
		WinWaitActive ahk_class WeChatLoginWndForPC
		Sleep 200
		Send {Enter}
	}else{
	flag := 0
	gosub  DOCKED
	}
	return
#IfWinActive ahk_class WeChatMainWndForPC
~!w::			;WeChatMainWndForPC微信
	gosub OnHostDeath
	Gui, Destroy
	return
#If

DOCKED:
	WinWaitActive ahk_class WeChatMainWndForPC
	WinGet, nPID, PID, A	;必须配置,DocK的host程序ID
	Dock_HostID := WinExist("ahk_pid " . nPID)			 ;检测主程序退出时调用的sub
	Dock_OnHostDeath := "OnHostDeath"
	;~ Gui +LastFound -Caption -SysMenu -Theme +ToolWindow +hwndClient1ID
	Gui  -Caption +hwndClient1ID
	Gui ,Font, s12
	Gui ,Add,text , x15 y10  w100 gMySub_SendFile_WeChat ,传输助手
	Gui ,Font
	loop , % MyWeRecArray.Length()
	{
		Gui ,Font, s12
		FF:=SubStr(MyWeRecArray[A_index],0,1)
		if (FF="-")
			Gui ,Add, text , x15 yp+28 cRed Disabled w100 gMySub_SendFile_WeChat,% MyWeRecArray[A_index]
		else
			Gui ,Add, text , x15 yp+28 w100 gMySub_SendFile_WeChat,% MyWeRecArray[A_index]
		Gui ,Font
	}
	Gui Show, NoActivate, 微信联系人列表
	dock(Client1ID, "x(0.983,0,) y(0,0.029,) t  ")			;调整位置————————————————————————
return

MySub_SendFile_WeChat:
	Gui,Submit,NoHide
	LXR:=A_GuiControl
	WinActivate,ahk_class WeChatMainWndForPC
	WinWaitActive ahk_class WeChatMainWndForPC
	ControlClick, x114 y45 ; , 微信,,,, Pos	;相对于窗体左上角的相对位置点击
	;删除已有数据
	;~ SendInput,^a
	;~ SendInput,{del}
	if (LXR="传输助手")
	{
		SendRaw 文件传输助手
	}
	else {
	SendRaw % LXR
	}
	Sleep, 900										;调整时间,太短失效————————————————————————
	SendInput,{Enter}
return

GuiClose:
	ExitApp

OnExit:
	;调用dock的退出
	Dock_Shutdown()
	;关闭所有相关的程序
	;退出程序
	ExitApp
return

OnHostDeath:
	;销毁dock
	Dock_Shutdown()
	;	Dock_Toggle(false)
	Gui, Destroy
return

Dock(pClientID, pDockDef="", reset=0) {                    ;Reset is internal parameter, used by Dock_Shutdown 
   local cnt, new, cx, cy, hx, hY, t, hP
   static init=0, idDel, classes="x|y|w|h"

    if (reset)                                             ;Used by Dock Shutdown to reset the function 
        return init := 0 

    if !init
        Dock_aClient_0_ := 0

   cnt := Dock_aClient_0_ 

   ;remove dock client ? 
   if (pDockDef="-") and (Dock_%pClientID%){ 

      idDel := Dock_%pClientID% 

      loop, parse, classes, |
        loop, 3
         Dock_%pClientID%_%A_LoopField%%A_Index% := ""
      Dock_%pClientID% := ""
      Dock_aClient_%idDel%_ := Dock_aClient_%cnt%_, Dock_aClient_%cnt%_ := "", Dock_aClient_0_-- 
      return "OK - Remove" 
   } 

   if pDockDef = 
   { 
      WinGetPos hX, hY,,, ahk_id %Dock_HostID% 
      WinGetPos cX, cY,,, ahk_id %pClientID% 
      pDockDef := "x(0,0," cX - hX ")  y(0,0," cY - hY ")"
   } 
    loop, parse, pDockDef, %A_Space%%A_Tab%
       if (A_LoopField != "") {
            t := A_LoopField, c := SubStr(t,1,1)
            if c not in x,y,w,h,t
                return "ERR: Bad dock definition"

            if c = t
            {
                 Dock_%pClientID%_t := 1
            }
            else {          
                t := SubStr(t,3,-1)
                StringReplace, t, t,`,,|,UseErrorLevel
                t .= !ErrorLevel ? "||" : (ErrorLevel=1 ? "|" : "")
                loop, parse, t,|,%A_Space%%A_Tab% 
                    Dock_%pClientID%_%c%%A_Index% := A_LoopField ? A_LoopField : 0
            }
       }

    if !Dock_%pClientID% {
        Dock_%pClientID%   := ++cnt, 
        Dock_aClient_%cnt%_ := pClientId 
        Dock_aClient_0_++ 
    }
   If !init { 
      init++, Dock_hookProcAdr := RegisterCallback("Dock_HookProc")
      Dock_Toggle(true)  
   } 

   Dock_Update()
   return "OK" 
}       

Dock_Shutdown() { 
   local cID 

   Dock_Toggle(false) 
   DllCall("GlobalFree", "UInt", Dock_hookProcAdr), Dock_hookProcAdr := "" 
   Dock(0,0,1)
   loop, % Dock_aClient_0_ 
   { 
      cId := Dock_aClient_%A_Index%_, Dock_aClient_%A_Index%_ := "" 
      Dock_%cID% := "" 
      loop, 10 
         Dock_%cID%_%A_Index% := "" 
   }
}

Dock_Toggle( enable="" ) { 
   global 

   if Dock_hookProcAdr = 
      return "ERR - Dock must be loaded." 

   if enable = 
      enable := !Dock_hHook1 
   else if (enable && Dock_hHook1)
        return  "ERR - Dock already enabled"

   if !enable 
      API_UnhookWinEvent(Dock_hHook1), API_UnhookWinEvent(Dock_hHook2), API_UnhookWinEvent(Dock_hHook3), Dock_hHook3 := Dock_hHook1 := Dock_hHook2 := "" 
   else  { 
      Dock_hHook1 := API_SetWinEventHook(3,3,0,Dock_hookProcAdr,0,0,0)              ; EVENT_SYSTEM_FOREGROUND 
      Dock_hHook2 := API_SetWinEventHook(0x800B,0x800B,0,Dock_hookProcAdr,0,0,0)    ; EVENT_OBJECT_LOCATIONCHANGE 
      Dock_hHook3 := API_SetWinEventHook(0x8002,0x8003,0,Dock_hookProcAdr,0,0,0)    ; EVENT_OBJECT_SHOW, EVENT_OBJECT_HIDE

      if !(Dock_hHook1 && Dock_hHook2 && Dock_hHook3) {    ;some of them failed, unregister everything
         API_UnhookWinEvent(Dock_hHook1), API_UnhookWinEvent(Dock_hHook2), API_UnhookWinEvent(Dock_hHook3) 
         return "ERR - Hook failed" 
      } 

     Dock_Update() 
   } 
   return enable
} 
;==================================== INTERNAL ====================================================== 
Dock_Update() { 
   local hX, hY, hW, hh, W, H, X, Y, cx, cy, cw, ch, fid, wd, cid 
   static gid=0   ;fid & gid are function id and global id. I use them to see if the function interupted itself. 

   wd := A_WinDelay 
   SetWinDelay, -1 
   fid := gid += 1 
   WinGetPos hX, hY, hW, hH, ahk_id %Dock_HostID%
    loop, % Dock_aClient_0_ 
    { 
        cId := Dock_aClient_%A_Index%_ 
        WinGetPos cX, cY, cW, cH, ahk_id %cID% 
        W := Dock_%cId%_w1*hW + Dock_%cId%_w2,  H := Dock_%cId%_h1*hH + Dock_%cId%_h2 
        X := hX + Dock_%cId%_x1*hW + Dock_%cId%_x2* (W ? W : cW) + Dock_%cId%_x3
        Y := hY + Dock_%cId%_y1*hH + Dock_%cId%_y2* (H ? H : cH) + Dock_%cId%_y3

        if (fid != gid)
            break

        if dock_resetT
        {
            dock_resetT := false
            DllCall("SetWindowLong", "uint", cId, "int", -8, "uint", 0)
        }
        DllCall("SetWindowPos", "uint", cId, "uint", 0, "uint", X ? X : cX, "uint", Y ? Y : cY, "uint", W ? W : cW, "uint", H ? H :cH, "uint", 1044)
    }      
    SetTimer, Dock_SetZOrder, -80
    SetWinDelay, %wd% 
}

Dock_SetZOrder:
    exists := WinExist("ahk_id " Dock_HostID), active := WInExist("A") = Dock_HostId
    loop, % Dock_aClient_0_  
    {
      _ := Dock_aClient_%A_Index%_, _ := Dock_%_%_t
      if !_
          DllCall("SetWindowPos", "uint", Dock_aClient_%A_Index%_, "uint", Dock_HostID, "uint", 0, "uint", 0, "uint", 0, "uint", 0, "uint", 19 | 0x4000 | 0x40)
      else {
        _ := DllCall("GetWindowLong", "uint", Dock_aClient_%A_Index%_, "int", -8)
        if !_ and exists
        {
            dock_resetT := true
            DllCall("SetWindowLong", "uint", Dock_aClient_%A_Index%_, "int", -8, "uint", Dock_HostId)
        }

        DllCall("SetWindowPos", "uint", Dock_aClient_%A_Index%_, "uint"
                , active ? 0 : DllCall("GetWindow", "uint", Dock_HostId, "uint", 3) ;hwndprev
                , "uint", 0, "uint", 0, "uint", 0, "uint", 0, "uint", 0x40 | 19 | 0x4000) ;SWP_SHOWWINDOW ..., no activate

    }
    }
return 

Dock_SetZOrder_OnClientFocus:
    res := DllCall("SetWindowPos", "uint", Dock_HostID, "uint", Dock_AClient, "uint", 0, "uint", 0, "uint", 0, "uint", 0, "uint", 19)
    loop, % Dock_aClient_0_
    {
        _ := Dock_aClient_%A_Index%_, _ := Dock_%_%_t
        if !_
             DllCall("SetWindowPos", "uint", Dock_aClient_%A_Index%_, "uint", Dock_HostID, "uint", 0, "uint", 0, "uint", 0, "uint", 0, "uint", 19)
    }
return 

Dock_HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime ) { 
    local e, cls, style

    if idObject or idChild
        return
    WinGet, style, Style, ahk_id %hwnd%
    if (style & 0x40000000)                 ;RETURN if hwnd is child window, for some reason idChild may be 0 for some children ?!?! ( I hate ms )
        return

    if (event = 3) 
    {
        loop, % Dock_aClient_0_
          if (hwnd = Dock_aClient_%A_Index%_){
            Dock_AClient := hwnd
            gosub Dock_SetZOrder_OnClientFocus
            return
        }       
    }

    If (hwnd != Dock_HostID){
      if !WinExist("ahk_id " Dock_HostID) && IsLabel(Dock_OnHostDeath)
      {
         Dock_Toggle(false)
         gosub %Dock_OnHostDeath% 
         loop, % Dock_aClient_0_
            DllCall("ShowWindow", "uint", Dock_aClient_%A_Index%_, "uint",  0)
      }
      return 
    } 


    if event in 32770,32771
    {
       e := (event - 32771) * -5
       loop, % Dock_aClient_0_
            DllCall("ShowWindow", "uint", Dock_aClient_%A_Index%_, "uint",  e)
    }

    Dock_Update() 
} 

Dock_Update:
    Dock_Update()
return

API_SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags) { 
   DllCall("CoInitialize", "uint", 0) 
   return DllCall("SetWinEventHook", "uint", eventMin, "uint", eventMax, "uint", hmodWinEventProc, "uint", lpfnWinEventProc, "uint", idProcess, "uint", idThread, "uint", dwFlags) 
} 

API_UnhookWinEvent( hWinEventHook ) { 
   return DllCall("UnhookWinEvent", "uint", hWinEventHook) 
}

 

给TA捐赠
共{{data.count}}人
人已捐赠
其他

AHK按钮版的脚本管理器

2018-1-13 19:37:32

其他

用AHK来模仿一下MouseGrid

2018-1-13 20:53:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索