ম্যাক ওএস এক্সে কোন প্রক্রিয়াটি কোন উইন্ডোটি চলছে তা কীভাবে চিহ্নিত করবেন?


28

আমি জানতে চাই যে ম্যাক ওএস এক্সে উইন্ডো তৈরি / পরিচালনার জন্য কোন প্রক্রিয়া দায়বদ্ধ তা সনাক্ত করা সম্ভব কিনা I'd

উদাহরণস্বরূপ, যখন কোনও অ্যাপ্লিকেশনটির একাধিক উদাহরণ শুরু হয়, তখন আমি কীভাবে একটি নির্দিষ্ট উইন্ডোর সাথে সম্পর্কিত প্রসেস আইডি (পিআইডি) পেতে পারি? বা যদি কোনও শিরোনাম ছাড়াই কোনও মডেল ডায়ালগ উইন্ডো থাকে তবে আমি কীভাবে এর মালিকের পিআইডি পেতে পারি?

আমি উইন্ডোজটিতে জানি যে সিসিনটার্নাল স্যুট সরঞ্জামটি ব্যবহার করা সম্ভব যা কোনও ডেটা দিয়ে চলছে এমন একটি লাইব্রেরির সন্ধানের একটি উপায় সরবরাহ করে।

আমি এই ব্লগপোস্টে প্রদর্শিত একটি সদৃশ একটি প্রক্রিয়া খুঁজছি ।

সেক্ষেত্রে সিসিনটার্নালস স্যুট (এবং প্রসেস এক্সপ্লোরার) ব্যবহার করে তারা আবিষ্কার করেছেন যে কোন ডিএলএল / প্রোগ্রামটি ওয়েবক্যামটি ডিএলএল বা সাবস্ট্রিং অনুসন্ধান করে (এই ক্ষেত্রে, ডিভাইসের শারীরিক নাম ব্যবহার করে) ওয়েবক্যাম ব্যবহার করছে।

সুতরাং কোনও মেকানিজম বা প্রোগ্রাম আছে, বা ম্যাক ওএস এক্স এর অনুরূপ কিছু কীভাবে সন্ধান করবেন সে সম্পর্কে আপনার কোনও ধারণা আছে? কোন প্রক্রিয়াটি একটি উইন্ডো চালু করেছে তা আমি কীভাবে সনাক্ত করতে পারি?


"... কোন প্রক্রিয়াটি কোন উইন্ডোটি দেখায় ..." আপনার উইন্ডোজ উদাহরণের সাথে তুলনা করার সময় এটি বিভ্রান্তিকর হয় ... "কোন ডিএলএল / প্রোগ্রামটি ওয়েবক্যামটি কোনও ডিএলএল বা স্ট্রারিং অনুসন্ধান করে ব্যবহার করেছিল please" আপনি কি দয়া করে আপনার প্রশ্নটি স্পষ্ট করতে সম্পাদনা করতে পারেন?
জ্যাকগোল্ড

1
কিছু প্রক্রিয়া কোনও উইন্ডো ছাড়াই চলছে এবং সম্ভবত কোনও নিয়ন্ত্রণকারী টার্মিনালও নেই।
বেসাইল স্টারিঙ্কেভিচ

উত্তর:


22

আমি পাইথন স্ক্রিপ্ট ব্যবহার করেছি । এটি নির্বোধ নয়, তবে এটি আমার পক্ষে বেশ কার্যকর।

আমি অনুমতি ব্যতীত পুরো স্ক্রিপ্টটি পুনরায় পোস্ট করব না, তবে এখানে একটি সংক্ষিপ্তসার রয়েছে: এটি সিস্টেম থেকে উইন্ডো সম্পর্কিত তথ্য সংগ্রহ করতে CGWindowListCopyWindowInfo, যা আমদানি করা Quartzহয় তা ব্যবহার করে, তারপরে ব্যবহারকারীকে পছন্দসই উইন্ডোটি সরানোর জন্য অনুরোধ করে, আবার উইন্ডো তথ্য সংগ্রহ করে এবং দেখায় যেগুলির জন্য তথ্য পরিবর্তিত হয়েছে ডাম্প করা তথ্যটিতে প্রক্রিয়া আইডি অন্তর্ভুক্ত রয়েছে kCGWindowOwnerPID

কোডটি এখানে:

#!/usr/bin/env python

import time
from Quartz import CGWindowListCopyWindowInfo, kCGWindowListExcludeDesktopElements, kCGNullWindowID
from Foundation import NSSet, NSMutableSet

wl1 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)
print 'Move target window'
time.sleep(5)
wl2 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)

w = NSMutableSet.setWithArray_(wl1)
w.minusSet_(NSSet.setWithArray_(wl2))
print '\nList of windows that moved:'
print w
print '\n'

স্ক্রিপ্টটি উইন্ডোটির জন্য তথ্য মুদ্রণ করে যা 5 সেকেন্ডের ব্যবধানের মধ্যে অবস্থান পরিবর্তন করে। সুতরাং আউটপুট এই মত দেখাচ্ছে:

List of windows that moved:
{(
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 217;
            Width = 420;
            X = 828;
            Y = 213;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 8;
        kCGWindowMemoryUsage = 406420;
        kCGWindowName = "";
        kCGWindowNumber = 77;
        kCGWindowOwnerName = UserNotificationCenter;
        kCGWindowOwnerPID = 481;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    }
)}

ঠিক আছে, আমি ঠিক যা খুঁজছিলাম তা নয়, তবে এটি একটি ভাল সূচনার পয়েন্ট। আপনাকে ধন্যবাদ!
আই.কৌগিল

@ কেচো অন - আমি নিশ্চিত না যে কীভাবে সেই সাইটটি যা দেখায় সেগুলি কীভাবে প্রয়োগ করা যায়, আপনি কী আরও বিস্তারিত বলতে পারবেন?
C_K

দেখে মনে হচ্ছে অজগর লিপির লিঙ্কটি মারা গেছে। আমি বিশ্বাস করি যে এখানে একটি নতুন ব্লগ সাইটে আমি একই পোস্টটি পেয়েছি: cadebaba.blogspot.com/2014/04/…
মার্ক এবার্ট

এটি একটি আশ্চর্যজনক স্ক্রিপ্ট। এটি আমার বাজে সফ্টওয়্যারটি আবিষ্কার করতে সহায়তা করেছিল যা আমি সনাক্ত করতে পারি না।
সামভেল আভনেসভ

নাইস !! সতর্কতা উইন্ডোগুলি পপ আপ করে এমন ম্যালওয়্যার সনাক্ত এবং মুছে ফেলার এটি প্রকৃতপক্ষে পরিষ্কার, সঠিক উপায়। একটি অ্যান্টিভাইরাস প্রোগ্রাম ইনস্টল করা এবং চালানোর চেয়ে অনেক ভাল যা কে জানে, সে নিজেই ম্যালওয়্যার হতে পারে।
জেরি ক্রিনক

15

আমি একটি সরঞ্জাম তৈরি করেছি lswin

$ python lswin.py

    PID WinID  x,y,w,h                  [Title] SubTitle
------- -----  ---------------------    -------------------------------------------
    169  1956 {0,-38,1280,25        }   [Window Server] Backstop Menubar
    169  1955 {0,-60,1280,22        }   [Window Server] Menubar
    169   396 {0,-38,1280,25        }   [Window Server] Backstop Menubar
    169   395 {0,-60,1280,22        }   [Window Server] Menubar
    169     6 {0,0,0,0              }   [Window Server] Cursor
    169     4 {0,22,1280,25         }   [Window Server] Backstop Menubar
    169     3 {0,0,1280,22          }   [Window Server] Menubar
    169     2 {0,0,1280,800         }   [Window Server] Desktop
    262   404 {0,-38,1280,38        }   [Google Chrome] 
    262   393 {0,0,1280,800         }   [Google Chrome] 
    262   380 {100,100,1,1          }   [Google Chrome] Focus Proxy
    ... ...

তারপরে আপনি আপনার উইন্ডোটির পিডটি খুঁজে পেতে গ্রেপ ব্যবহার করতে পারেন।

এখানে স্ক্রিপ্টের উত্স কোড:

#!/usr/bin/env python

import Quartz

#wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionOnScreenOnly | Quartz.kCGWindowListExcludeDesktopElements, Quartz.kCGNullWindowID)
wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)

wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID'))

#print wl

print 'PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + '  ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title] SubTitle'
print '-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + '  ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------'

for v in wl:
    print ( \
        str(v.valueForKey_('kCGWindowOwnerPID') or '?').rjust(7) + \
        ' ' + str(v.valueForKey_('kCGWindowNumber') or '?').rjust(5) + \
        ' {' + ('' if v.valueForKey_('kCGWindowBounds') is None else \
            ( \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('X')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Y')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Width'))) + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Height'))) \
            ) \
            ).ljust(21) + \
        '}' + \
        '\t[' + ((v.valueForKey_('kCGWindowOwnerName') or '') + ']') + \
        ('' if v.valueForKey_('kCGWindowName') is None else (' ' + v.valueForKey_('kCGWindowName') or '')) \
    ).encode('utf8')

পুরোপুরি কাজ করে। @ Osexp2003 ভাগ করে নেওয়ার জন্য ধন্যবাদ!
খড়

10

@ টেনরব আমি আপনার স্ক্রিপ্টের 2 টি সংস্করণ একত্রিত করেছি, মূলত এটি প্রথমটির মতো কাজ করে, পার্থক্য দেখায় তবে বিন্যাসটি দ্বিতীয়টি থেকে। এছাড়াও যদি উইন্ডোটি স্ক্রিনে না থাকে - এটি মুদ্রিত হচ্ছে না, অন্যথায় এটি অত্যধিক আবর্জনা দেয়

import Quartz
import time
from Foundation import NSSet, NSMutableSet
def transformWindowData(data):
    list1 = []
    for v in data:
        if not v.valueForKey_('kCGWindowIsOnscreen'):
            continue


        row = ( \
            str(v.valueForKey_('kCGWindowOwnerPID') or '?').rjust(7) + \
            ' ' + str(v.valueForKey_('kCGWindowNumber') or '?').rjust(5) + \
            ' {' + ('' if v.valueForKey_('kCGWindowBounds') is None else \
                ( \
                    str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('X')))     + ',' + \
                    str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Y')))     + ',' + \
                    str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Width'))) + ',' + \
                    str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Height'))) \
                ) \
                ).ljust(21) + \
            '}' + \
            '\t[' + ((v.valueForKey_('kCGWindowOwnerName') or '') + ']') + \
            ('' if v.valueForKey_('kCGWindowName') is None else (' ' + v.valueForKey_('kCGWindowName') or '')) \
        ).encode('utf8')
        list1.append(row)

    return list1;

def printBeautifully(dataSet):
    print 'PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + '  ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title] SubTitle'
    print '-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + '  ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------'

    # print textList1
    for v in dataSet:
        print v;

#grab initial set
wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)
wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID'))

#convert into readable format
textList1 = transformWindowData(wl);

#print everything we have on the screen
print 'all windows:'
printBeautifully(textList1)

print 'Move target window'
time.sleep(5)

#grab window data the second time
wl2 = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)
textList2 = transformWindowData(wl2)

#check the difference
w = NSMutableSet.setWithArray_(textList1)
w.minusSet_(NSSet.setWithArray_(textList2))

#print the difference
printBeautifully(w)

ফ্যান্টাস্টিক। ম্যাকের জন্য এক্সকিলের আরও এক ধাপ!
মাইকেল ফক্স

2
সামান্য বিট সহpip install pyobjc-framework-Quartz
কাপউনটাই

নোট করুন যে স্ক্রিপ্টটি মাল্টি-মনিটরের সেট আপগুলির সাথে 100% কাজ করে না। আপনি যদি এটি কোনও স্ক্রিনের টার্মিনালে চালনা করেন এবং উইন্ডোটিকে অন্য স্ক্রিনে সরিয়ে নিয়ে যান তবে আপনি অনেকগুলি উইন্ডো ডিফের তালিকাভুক্ত দেখতে পাবেন। এগুলির সবগুলিই মেনু বারের সিস্টেম উইন্ডোজ এবং আইকনগুলি বলে মনে হচ্ছে running আপনার টার্মিনাল এবং রহস্য উইন্ডোটি চালানোর আগে একই স্ক্রিনে সরিয়ে নেওয়া ভাল।
ডেভবার্নস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.