исполняемые файлы Windows, соответствующие значкам в системном трее? - PullRequest
2 голосов
/ 17 сентября 2011

Есть ли способ использовать Python для получения списка всех значков в системном трее (нижний правый угол) и связанных с ними процессов и исполняемых файлов?

Вот ветка о том, как это сделать с помощью AHK:

http://www.autohotkey.com/forum/topic17314.html

но он сильно зависит от AHK.

Обратите внимание, что я заинтересован в Windows XP / 7

.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Это толстый, толстый материал win32. Я начал писать это, используя pywin32, но переключился на ctypes, чтобы лучше разобраться со структурами. Обратите внимание, я написал это в 32 Win XP. Вы получите изменение TBBUTTON def для 64 бит. Я не уверен, что UAC сделает с этим (можете ли вы выделить память в другом процессе?).

import commctrl, win32con
from ctypes import *

# represent the TBBUTTON structure
# note this is 32 bit, 64 bit padds 4 more reserved bytes
class TBBUTTON(Structure):
    _pack_ = 1
    _fields_ = [
        ('iBitmap', c_int),
        ('idCommand', c_int),
        ('fsState', c_ubyte),
        ('fsStyle', c_ubyte),
        ('bReserved', c_ubyte * 2),
        ('dwData', c_ulong),
        ('iString', c_int),
    ]

# get the handle to the sytem tray
hWnd = windll.user32.FindWindowA("Shell_TrayWnd", None)
hWnd = windll.user32.FindWindowExA(hWnd, None, "TrayNotifyWnd", None)
hWnd = windll.user32.FindWindowExA(hWnd, None, "SysPager", None)
hWnd = windll.user32.FindWindowExA(hWnd, None, "ToolbarWindow32", None)

# get the count of icons in the tray
numIcons = windll.user32.SendMessageA(hWnd, commctrl.TB_BUTTONCOUNT, 0, 0)

# allocate memory within the system tray
pid = c_ulong();
windll.user32.GetWindowThreadProcessId(hWnd, byref(pid))
hProcess = windll.kernel32.OpenProcess(win32con.PROCESS_ALL_ACCESS, 0, pid)
lpPointer = windll.kernel32.VirtualAllocEx(hProcess, 0, sizeof(TBBUTTON), win32con.MEM_COMMIT, win32con.PAGE_READWRITE)

# init our tool bar button and a handle to it
tbButton = TBBUTTON()
butHandle = c_int()

for i in range(numIcons):
    # query the button into the memory we allocated
    windll.user32.SendMessageA(hWnd, commctrl.TB_GETBUTTON, i, lpPointer)
    # read the memory into our button struct
    windll.kernel32.ReadProcessMemory(hProcess, lpPointer, addressof(tbButton), 20, None)
    # read the 1st 4 bytes from the dwData into the butHandle var
    # these first 4 bytes contain the handle to the button
    windll.kernel32.ReadProcessMemory(hProcess, tbButton.dwData, addressof(butHandle), 4, None)

    # get the pid that created the button
    butPid = c_ulong()
    windll.user32.GetWindowThreadProcessId(butHandle, byref(butPid))

    # i leave it to you to get the process from the pid
    # that should be trivial...
    print butPid
1 голос
/ 17 сентября 2011

Мне кажется, что он больше зависит от API Windows, чем от Ahk, который, вероятно, является просто оболочкой, учитывая, что параметры на сайте, на который вы ссылаетесь, глупы для их случая использования - например, hWnd, 101, 0, 0,0,0--, который обычно предлагает windows api struct-type-вещи;).Я очень сомневаюсь, что вы можете просто подключить и играть что-нибудь здесь, учитывая, что это несколько необычная цель и очень специфическая для окон.Если вы хотите сделать свою собственную реализацию, вы, скорее всего, получите большую помощь от веб-сайта Тима Голдена, и если бы кто-то делал это раньше, я бы подумал, что это он:

http://timgolden.me.uk/python/wmi/index.html

Марк Хаммонд и модули ядра ядра Python также являются разумными поисковыми словами, но почему-то для этого все еще относительно мало документации, и я думаю, что книга 2000 года не слишком поможет.

В противном случае вы можете сделать любой из вызовов, которые может сделать ахк, но для этого нужно прочитать MSDN ... Ваши усилия будут значительно сокращены, если вы будете примерно знать, чего вы хотите от сценария AHK.Но это все равно будет раздражать.

Ранние главы Grayhat Python могут оказаться полезными, если вы хотите увидеть примеры того, как реализовать вызовы windows api (создание структуры, вызов функций и т. Д.).Я обнаружил, что это более полезно, чем большинство материалов, которые поступают непосредственно из групп python-windows, которые, несомненно, были немного над моей головой.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...