Обнаружьте запуск сценария от командной строки или “дважды щелкните” по Windows

Это на самом деле связано с c ++ - cx, и я нацеливаю этот тег на вашу проблему.

Чтобы упростить навигацию, мы можем использовать систему тегов в нашем приложении. Смотрите следующий код:

    <NavigationView x:Name="NavigationViewControl" ItemInvoked="NavigationViewControl_ItemInvoked" >
        <NavigationView.MenuItems>
            <NavigationViewItem Content="A" x:Name="A" Tag="tga" />
            <NavigationViewItem Content="B" x:Name="B" Tag="tgb"/>
            <NavigationViewItem Content="C" x:Name="C" />
        </NavigationView.MenuItems>
        <Frame x:Name="contentFrame"/>
    </NavigationView>

Это пример, мы добавим теги к нашим элементам. Затем мы сделаем следующее в нашем коде вызова:

void NavigationVWCX::MainPage::NavigationViewControl_ItemInvoked(Windows::UI::Xaml::Controls::NavigationView^ sender, Windows::UI::Xaml::Controls::NavigationViewItemInvokedEventArgs^ args)
{
    auto navitemtag = args->InvokedItemContainer->Tag->ToString();
    if (navitemtag == "tga")
    {
        contentFrame->Navigate(Windows::UI::Xaml::Interop::TypeName(PageA::typeid));
    }
    if (navitemtag == "tgb")
    {
        contentFrame->Navigate(Windows::UI::Xaml::Interop::TypeName(PageB::typeid));
    }   
}

Кстати, не забудьте также добавить тег на свои страницы, например:

PageB::PageB()
{
    InitializeComponent();
    this->Tag = "tgb";
}
7
задан pkit 17 February 2009 в 21:20
поделиться

3 ответа

Вот пример того, как получить идентификатор родительского процесса и название текущего под управлением сценария. Как предложено Tomalak это может использоваться, чтобы обнаружить, если сценарий был запущен с командной строки или путем двойного щелчка в проводнике.

import win32pdh
import os

def getPIDInfo():
    """ 
    Return a dictionary with keys the PID of all running processes.
    The values are dictionaries with the following key-value pairs:
        - name: <Name of the process PID>
        - parent_id: <PID of this process parent>
    """

    # get the names and occurences of all running process names
    items, instances = win32pdh.EnumObjectItems(None, None, 'Process', win32pdh.PERF_DETAIL_WIZARD)
    instance_dict = {}
    for instance in instances:
        instance_dict[instance] = instance_dict.get(instance, 0) + 1

    # define the info to obtain 
    counter_items =  ['ID Process', 'Creating Process ID']

    # output dict
    pid_dict = {}

    # loop over each program (multiple instances might be running)
    for instance, max_instances in instance_dict.items():
        for inum in xrange(max_instances):
            # define the counters for the query 
            hq = win32pdh.OpenQuery()
            hcs = {}
            for item in counter_items:
                path = win32pdh.MakeCounterPath((None,'Process',instance, None,inum,item))
                hcs[item] = win32pdh.AddCounter(hq,path)
            win32pdh.CollectQueryData(hq)

            # store the values in a temporary dict
            hc_dict = {}
            for item, hc in hcs.items():
                type,val=win32pdh.GetFormattedCounterValue(hc,win32pdh.PDH_FMT_LONG)
                hc_dict[item] = val
                win32pdh.RemoveCounter(hc)
            win32pdh.CloseQuery(hq)

            # obtain the pid and ppid of the current instance
            # and store it in the output dict
            pid, ppid = (hc_dict[item] for item in counter_items) 
            pid_dict[pid] = {'name': instance, 'parent_id': ppid}

    return pid_dict

def getParentInfo(pid):
    """
    Returns a PID, Name tuple of the parent process for the argument pid process.
    """
    pid_info = getPIDInfo()
    ppid = pid_info[pid]['parent_id']
    return ppid, pid_info[ppid]['name']

if __name__ == "__main__":
    """
    Print the current PID and information of the parent process.
    """
    pid = os.getpid()
    ppid, ppname = getParentInfo(pid)

    print "This PID: %s. Parent PID: %s, Parent process name: %s" % (pid, ppid, ppname)
    dummy = raw_input()

Когда выполнено от командной строки это производит:

Этот PID: 148. Родительский PID: 4660, имя Родительского процесса: cmd

При запуске путем двойного щелчка в проводнике это производит:

Этот PID: 1896. Родительский PID: 3788, имя Родительского процесса: проводник

3
ответ дан 6 December 2019 в 12:55
поделиться

Командная строка запустилась, сценарию назвали родительский процесс cmd.exe (или несуществующий процесс, в случае, если консоль была закрыта тем временем).

Запущенному с двойного щелчка сценарию нужно назвать родительский процесс explorer.exe.

3
ответ дан 6 December 2019 в 12:55
поделиться

Хороший вопрос. Одна вещь, которую Вы могли сделать, создают ярлык на сценарий в Windows и передают аргументы (использующий свойство Target ярлыка), который обозначил бы, что сценарий был запущен путем двойного щелчка (в этом случае, ярлык).

2
ответ дан 6 December 2019 в 12:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: