سؤال

هل يمكن لأي شخص أن يخبرني كيف يمكنني التقاط عملية قيد التشغيل في C # باستخدام فئة العملية إذا كنت أعرف بالفعل المقبض؟

معرف بدلا من ذلك، لا يجب أن تعدد طريقة عمليات GetRunning إما. بينكوك على ما يرام إن أمكن.

هل كانت مفيدة؟

المحلول

في Clase C #، يبدو أنك يجب أن تحميم من خلالهم جميعا:

// IntPtr myHandle = ...
Process myProcess = Process.GetProcesses().Single(
    p => p.Id != 0 && p.Handle == myHandle);

المثال أعلاه فشل عمدا إذا لم يتم العثور على المقبض. خلاف ذلك، يمكنك استخدام بالطبع SingleOrDefault. وبعد على ما يبدو، لا يحبك طلب مقبض معرف العملية 0, ، وبالتالي الشرط الإضافي.

باستخدام Winapi، يمكنك استخدام GetProcessId. وبعد لم أستطع العثور عليه على Pinvoke.net، ولكن هذا يجب أن يفعل:

[DllImport("kernel32.dll")]
static extern int GetProcessId(IntPtr handle);

(يستخدم التوقيع DWORD, ، ولكن معرفات العملية ممثلة intS في .NET BCL)

يبدو من الغريب بعض الشيء أن يكون لديك مقبض، ولكن ليس معرف عملية ولكن. يتم الحصول على مقابض العملية عن طريق الاتصال OpenProcess, ، والتي تأخذ معرف العملية.

نصائح أخرى

using System.Diagnostics;

class ProcessHandler {
    public static Process FindProcess( IntPtr yourHandle ) {
        foreach (Process p in Process.GetProcesses()) {
            if (p.Handle == yourHandle) {
                return p;
            }
        }

        return null;
    }
}

يبدو أن هناك طريقة بسيطة للقيام بذلك من قبل API .NET. السؤال هو، حيث حصلت على هذا المقبض من؟ إذا كان ذلك بنفس الطريقة يمكنك الوصول إلى معرف العمليات، فيمكنك استخدام:

Process.GetProcessById (int iD)

يمكنك استخدام مكالمة Winapi GetWindowThroadprocessid

http://www.pinvoke.net/default.aspx/user32/getwindowthreadprocessid.html.

للحصول على معرف العملية - ثم احصل على كائن عملية باستخدام ذلك .....

ولكن لماذا لا تريد تعداد معرفات العمليات الجارية؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top