精华内容
下载资源
问答
  • 这是本人在编程中碰到的一个问题,寻找了其他案例,都只是同时打开两窗口,但不能实现在拥有块显示屏时候,分别将两个不同的窗口显示在两个单独的屏幕。 源代码...

    这是本人在编程中碰到的一个问题,寻找了其他案例,都只是同时打开两窗口,但不能实现在拥有两块显示屏时候,分别将两个不同的窗口显示在两个单独的屏幕。

    源代码https://download.csdn.net/download/qq_42237381/10728021

    目录

    一、原理说明

    二、具体操作

    1.新建项目

    2.添加新的form窗口

    3.新建类

    4.修改程序启动类


    一、原理说明

     

    实现的方法是添加一个类,这个类中的代码功能是使两个窗口同时运行

    定义一个集合,将Form1和Form2放入集合,foreach遍历集合便可以实现同时打开两窗口功能,

     var formlist = new List<Form>() { new Form1(), new Form2() };
    
                foreach (var item in formlist)
                {
                    item.Show();
    
                }

    Screen函数是关于当前显示屏幕的集合,这样将窗口启动的起始位置设置为某块屏幕就能实现功能

    Screen[] sc = Screen.AllScreens;

    设定窗口起始位置StartPosition属性由窗口的位置location属性决定,使用下面的语句就可以 

    f2.StartPosition = FormStartPosition.Manual;

    然后在将窗口的位置属性location设置到屏幕2上

      f2.Location = new Point(sc[1].Bounds.Left, sc[1].Bounds.Top);

    这样就可以实现需求了 

    二、具体操作

    具体操作如下

    1.新建项目

    新建winform项目,

    2.添加新的form窗口

    此时已经有一个窗口Form1,这时在解决方案管理器窗口右键项目名称添加一个窗口类Form2

    3.新建类

    再和上面操作一样添加一个类class1.cs

    类里面写运行两窗口的代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace TwoWinform
    {
        class class1 : ApplicationContext
        {
    
    
            private void onFormClose(object sendr, EventArgs e)
            {
    
                if (Application.OpenForms.Count == 0)
                {
                    ExitThread();
                }
            }
    
    
            public class1()
            {
                Screen[] sc = Screen.AllScreens;
    
    
                窗口2显示在屏幕2
                Form2 f2 = new Form2();
                f2.StartPosition = FormStartPosition.Manual;
                f2.Location = new Point(sc[1].Bounds.Left, sc[1].Bounds.Top);
    
                var formlist = new List<Form>() { new Form1(), f2 };
    
                foreach (var item in formlist)
                {
                    item.Show();
    
                }
            }
    
        }
    }
    

    4.修改程序启动类

    再修改程序启动类program使运行class1.cs即可 

    using Microsoft.VisualBasic;
    namespace AntiUAV
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。      
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new class1()) ;//运行双窗口类
                
            }
        }
    }

    此案例可以应用到很多地方,比如超市收款机上两屏幕,解决一个对客户,一个对收款员两个显示不同情况下的需求。

    此案例可以扩展到多个屏幕,不管多少屏幕都能实现。

    展开全文
  • 连续两次打开同一个文件

    千次阅读 2013-03-02 13:59:01
    这篇文章中我们先讨论第种情况:同一个用户连续两次打开同一个文件。  用户user1以只读权限打开了文件file1,未关闭文件的情况下又以只读权限打开了文件file1。第次执行正常的操作,向服务器发送OPEN请求。...

            前面几篇文章中我们讲解了OPEN操作中最基本的情况:打开服务器端存在的一个文件,接下来的几篇文章中,我们讨论几种特殊情况。这篇文章中我们先讨论第一种情况:同一个用户连续两次打开同一个文件。

        用户user1以只读权限打开了文件file1,未关闭文件的情况下又以只读权限打开了文件file1。第一次执行正常的操作,向服务器发送OPEN请求。那么第二次呢?还需要向服务器发送OPEN请求吗?事实上第二次打开文件时就不向服务器发送OPEN请求了。RPC请求为应用程序预留了几个接口,应用程序在发起RPC请求的过程中可以注册几个处理函数。

    struct rpc_call_ops {
            void (*rpc_call_prepare)(struct rpc_task *, void *);
            void (*rpc_call_done)(struct rpc_task *, void *);
            void (*rpc_count_stats)(struct rpc_task *, void *);
            void (*rpc_release)(void *);
    };
    
    rpc_call_prepare()是发起RPC请求报文前执行的函数

    rpc_call_done()是处理完RPC应答报文后执行的函数

    rpc_count_stats()是一个统计函数,也是在处理完RPC应答报文后执行

    rpc_release()是释放资源的函数,比如释放RPC请求过程中申请的内存,当RPC执行完毕或者失败时都会调用这个函数。

    OPEN操作中向RPC注册了几个处理函数,处理函数如下:

    static const struct rpc_call_ops nfs4_open_ops = {
            .rpc_call_prepare = nfs4_open_prepare,
            .rpc_call_done = nfs4_open_done,
            .rpc_release = nfs4_open_release,
    };
    
    这里我们重点关注nfs4_open_prepare(),这个函数代码如下:

    // 发送RPC报文前调用这个函数.
    static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
    {
            struct nfs4_opendata *data = calldata;          // 取出nfs4_opendata结构
            struct nfs4_state_owner *sp = data->owner;      // nfs4_state_owner结构
    
            // NFSv4中,操作需要实现序列化。nfs_wait_on_sequence()判断OPEN操作是否可以马上执行,
            // 如果不能马上执行就将OPEN操作放入队列中等待,执行推出就可以了。
            if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
                    return;
            /*
             * Check if we still need to send an OPEN call, or if we can use
             * a delegation instead.
             */
    	// data->state是nfs4_state结构。客户端调用nfs4_get_open_state()查找符合条件的nfs4_state结构,
    	// 如果不存在就创建一个新的nfs4_state结构,执行到这里时data->state不为NULL.
            if (data->state != NULL) {      // 这是一个nfs4_state结构.
                    struct nfs_delegation *delegation;
    
    		// 查看这个文件是否已经打开了.
                    if (can_open_cached(data->state, data->o_arg.fmode, data->o_arg.open_flags))
                            goto out_no_action;	// 这个文件已经打开了,我们不需要再次执行OPEN操作了.
                    rcu_read_lock();
    
    		// 暂时不考虑delegation.
                    delegation = rcu_dereference(NFS_I(data->state->inode)->delegation);
                    if (data->o_arg.claim != NFS4_OPEN_CLAIM_DELEGATE_CUR &&
                        can_open_delegated(delegation, data->o_arg.fmode))
                            goto unlock_no_action;
                    rcu_read_unlock();
            }
    
            // 这个进程可能睡眠了一段时间,需要更新一些信息.
            data->o_arg.clientid = sp->so_server->nfs_client->cl_clientid;
            if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
                    task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
                    nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
            }
            data->timestamp = jiffies;      // 更新时间戳
            if (nfs4_setup_sequence(data->o_arg.server,
                                    &data->o_arg.seq_args,
                                    &data->o_res.seq_res, task))
                    return;
            rpc_call_start(task);	// 第一次打开文件,发起OPEN请求.
            return;
    unlock_no_action:
            rcu_read_unlock();
    out_no_action:
            task->tk_action = NULL;	// 设置RPC中下一步操作为NULL,就不需要发起OPEN请求了.
    
    }
    data->state是nfs4_state结构,调用这个函数前客户端通过nfs4_get_open_state()查找符合条件的nfs4_state结构,如果不存在就创建一个新的结构。因此第一次OPEN过程中会创建一个新的nfs4_state结构,第二次OPEN过程中就不需要创建了。if语句中调用了一个函数can_open_cached(),这个函数的作用就是判断是否需要发起OPEN请求。如果这个函数的返回值不为0,代码跳转到out_no_action,设置task->tk_action=NULL,RPC请求直接退出,就不需要发送OPEN请求报文了。先给出结论:第二次OPEN过程中程序就从这里退出了。暂时不考虑delegation,则当can_open_cached()返回值为0时会执行到rpc_call_start(task),然后就发送请求报文了,第一次OPEN操作中就是这样执行的。接下来我们看看函数can_open_cached(),这个函数是如何判断是否需要发起OPEN请求的。

    static int can_open_cached(struct nfs4_state *state, fmode_t mode, int open_mode)
    {
            int ret = 0;
    
            if (open_mode & (O_EXCL|O_TRUNC))
                    goto out;
            switch (mode & (FMODE_READ|FMODE_WRITE)) {
                    case FMODE_READ:
                            ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0
                                    && state->n_rdonly != 0;
                            break;
                    case FMODE_WRITE:
                            ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0
                                    && state->n_wronly != 0;
                            break;
                    case FMODE_READ|FMODE_WRITE:
                            ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0
                                    && state->n_rdwr != 0;
            }
    out:
            return ret;
    }

        can_open_cached()查看了客户端是否已经以相同的访问权限打开了文件,比如两次以只读权限打开文件,则第一次OPEN过程会设置标志位NFS_O_RDONLY_STATE,并且增加n_rdonly的计数,因此第二次OPEN过程就从第一个case语句推出了。


        我们接着看nfs4_state的设置函数,由于第二次文件打开过程中没有发起OPEN请求,因此data->rpc_done==0,因此执行的函数是nfs4_try_open_cached(data),代码如下:
    static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
    {
            struct inode *inode;
            struct nfs4_state *state = NULL;
            struct nfs_delegation *delegation;
            int ret;
    
    .
            if (!data->rpc_done) {  // 由于没有发起RPC请求,因此data->rpc_done==0
                    state = nfs4_try_open_cached(data);
                    goto out;
            }
    
            ......
    
    out:
            return state;
    err_put_inode:
            iput(inode);
    err:
            return ERR_PTR(ret);
    }
    

        那么nfs4_try_open_cached()做了什么事情呢?暂时不考虑delegation,这个函数简化后的代码如下:

    static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
    {
            struct nfs4_state *state = opendata->state;     // 这是使用的nfs4_state结构.
            struct nfs_inode *nfsi = NFS_I(state->inode);   // 这是文件索引节点
            struct nfs_delegation *delegation;
            int open_mode = opendata->o_arg.open_flags & (O_EXCL|O_TRUNC);
            fmode_t fmode = opendata->o_arg.fmode;          // 这是文件访问模式
            nfs4_stateid stateid;
            int ret = -EAGAIN;
    
            for (;;) {
                    if (can_open_cached(state, fmode, open_mode)) {
                            spin_lock(&state->owner->so_lock);      // 加锁
                            if (can_open_cached(state, fmode, open_mode)) {
                                    update_open_stateflags(state, fmode);   // 这个函数中增加了相应权限进程的个数.
                                    spin_unlock(&state->owner->so_lock);
                                    goto out_return_state;
                            }
                            spin_unlock(&state->owner->so_lock);
                    }
                    ......
            }
    out:
            return ERR_PTR(ret);
    out_return_state:
            atomic_inc(&state->count);      // 这里增加使用计数了. 
            return state;
    }
    
        因此,nfs4_try_open_cached()直接调用了函数update_open_stateflags(),这个函数的作用是更新nfs4_state结构中的信息,前面的文章中讲解过这个函数了。



    展开全文
  • 代码参考: C#代码 程序只能运行一次!防止程序运行多实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多实例时激活的是第一个实例,使其获得焦点,并在前端显示.主要用到两个API 函数:...

    代码参考: C#代码 程序只能运行一次!

    防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在前端显示.

    主要用到两个API 函数:

    • ShowWindowAsync 该函数设置由不同线程产生的窗口的显示状态。
    • SetForegroundWindow 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。

    代码如下:

    1. static class Program
    2.     {
    3.         /// <summary>
    4.         /// 该函数设置由不同线程产生的窗口的显示状态。
    5.         /// </summary>
    6.         /// <param name="hWnd">窗口句柄</param>
    7.         /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>
    8.         /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>
    9.         [DllImport("User32.dll")]
    10.         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    11.         /// <summary>
    12.         /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
    13.         /// </summary>
    14.         /// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>
    15.         /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>
    16.         [DllImport("User32.dll")]
    17.         private static extern bool SetForegroundWindow(IntPtr hWnd);
    18.         private const int WS_SHOWNORMAL = 1;
    19.         /// <summary>
    20.         /// 应用程序的主入口点。
    21.         /// </summary>
    22.         [STAThread]
    23.         static void Main()
    24.         {
    25.             Application.EnableVisualStyles();
    26.             Application.SetCompatibleTextRenderingDefault(false);
    27.             Process instance = RunningInstance();
    28.             if (instance == null)
    29.             {
    30.                 Form1 frm = new Form1();
    31.                 Application.Run(new Form1());
    32.             }
    33.             else
    34.             {
    35.                 HandleRunningInstance(instance);
    36.             }
    37.         }
    38.         /// <summary>
    39.         /// 获取正在运行的实例,没有运行的实例返回null;
    40.         /// </summary>
    41.         public static Process RunningInstance()
    42.         {
    43.             Process current = Process.GetCurrentProcess();
    44.             Process[] processes = Process.GetProcessesByName(current.ProcessName);
    45.             foreach (Process process in processes)
    46.             {
    47.                 if (process.Id != current.Id)
    48.                 {
    49.                     if (Assembly.GetExecutingAssembly().Location.Replace("/""//") == current.MainModule.FileName)
    50.                     {
    51.                         return process;
    52.                     }
    53.                 }
    54.             }
    55.             return null;
    56.         }
    57.         /// <summary>
    58.         /// 显示已运行的程序。
    59.         /// </summary>
    60.         public static void HandleRunningInstance(Process instance)
    61.         {
    62.             ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //显示,可以注释掉
    63.             SetForegroundWindow(instance.MainWindowHandle);            //放到前端
    64.         }
    65.     }

    记着引用以下命名空间:
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Reflection;

    展开全文
  • cmd一次打开应用程序

    千次阅读 2014-11-20 11:11:57
    那就写一个脚本吧,只需要点击一次,就可以打开应用程序了。 :: open some software @echo off start "title" "C:\Program Files (x86)\Netease\POPO\Start.exe" start "title" "C:\Program File...

    我大程序员每次开机都需要打开很多软件,设为开机启动又影响开机速度,怎么办呢?

    那就写一个脚本吧,只需要点击一次,就可以打开多个应用程序了。

     

    :: open some software
    @echo off
    start "title" "C:\Program Files (x86)\Netease\POPO\Start.exe"
    start "title" "C:\Program Files (x86)\Netease\网易闪电邮\Start.exe"
    start "title" "C:\Program Files (x86)\Yixin\EasyChat\yixin.exe"
    start "title" "C:\Program Files (x86)\Sublime Text 2\sublime_text.exe" 
    start "title" "D:\Projects\code\client\cocos2d-win32.vc2010.sln"


    ::表示注释

     

    @echo off , echo off 关闭显示执行的命令行,加上@表示当前echo off也不显示

    start,这个才是重点哟,简单格式:

    start 要打开软件的完全路径

    如果路径中有空格必须写成:

    start "命令行窗口标题" "要打开软件的完全路径"

    start后必须有空格

    如果路径中没有空格,可以不加引号,

    如果路径中含有空格,start后第一个带引号的参数默认是标题,因此需要加上标题,必须带引号,并且后加空格,然后加上带引号的完整路径。

     

     

    展开全文
  • 还不会怎样同时打开微信?一次性打包带走吧

    万次阅读 多人点赞 2021-07-17 04:09:12
    随着微信的广泛应用,大家很有可能有两个或多微信,不再只使用一个微信了。因此,微信多开,在电脑上同时登录多微信,对我们日常的使用起到狠便捷的作用。在这里聊聊怎样在 PC 端同时登录多微信。
  • 微信小程序同一个页面压入历史栈两次,返回第二次页面没数据 问题描述 最近项目中遇到一个场景,页面A(A1) =&gt; B =&gt; A(A2), 然后返回时,先从页面返回时,从A2 =&gt; B =&gt; A1, A2 回退...
  • 有时在做一个C#的程序时,你并不希望用户重复打开,为了避免程序被重复打开所带来的不确定因素,就需要在程序运行前做一些处理,来提示使用者。这里提供种方法,亲测有效。 在项目的第一个窗体的启动事件中 ...
  • fopen多次打开同一个文件

    万次阅读 2017-10-11 17:19:17
    最近在弄一个项目,需要读取tex文件,但是函数每调用一次打开一次文件,调用完之后就会发现再调用就打不开这文件,数据根本读不出来,后来采取一个最笨的办法,每次调用函数都重新用fopen打开一次文件,最后实在...
  • 1.两个进程中分别产生生成两个独立的fd 2.两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性 3.进程可以通过系统调用对文件加锁,从而实现对文件内容的保护 4.任何一个进程删除该文件时,另外一个...
  • Linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗? :结论 1.两个进程中分别产生生成两个独立的fd 2.两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性 3.进程可以通过系统...
  • using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms;namespace CB_ze { static class Program { /// /// 应用程序的主入口点。 ///
  • 打开一个命令窗口,一次显示5WindowsApplication2.exe:for /L %%i in (1,1,5) do @start C:/WindowsApplication2.exe2.打开一个命令窗口,一次显示一个WindowsApplication2.exe,一个关闭后显示下WindowsApp
  • 开机启动程序过多,导致电脑启动变慢,不开机启动又要自己一个一个手动来双击打开,开了QQ开飞信再开旺信,太累!怎么办?让小编来告诉你如何一键打开个程序! 工具/原料 电脑台 系统自带记事本 方法...
  • 如题,程序源码是有的。...本来打算用.bat的批处理方法,但它每次都要打开,而且每次都只能运行一次,要不就是打开两个程序,要不就是关闭两个 程序,效果不理想。 想请问下可以怎么直接在源码中修改,或是用别的方法。
  • 在做上一个项目之前,并没有意识到这问题,上一个项目是一个java web项目,只是网页程序,登录啥的,两个进程在运行的同时没有太多影响。 突然有一个项目,要求单独做份后台服务,用于处理接受webservice并做...
  • 如题,需要在一个wpf程序中实现点击按钮,打开一个独立的WPF程序,wpf程序的地址是已知的,且两个程序间不需要关联操作,只需要打开即可。
  • 介绍让程序实现单例模式,只能打开一次,这已经是一个老生常谈的问题了。方法也有很多,比如说监听端口,文件锁。我这里介绍一个用共享内存的方法。
  • 本文要实现的功能就是在windows下,实现用一个程序打开,关闭和监视其它的exe程序,我这里的的exe程序是我自己实现的。 1.监视exe是否崩溃 首先如果一个进程不在了,它的进程ID就是0, 那么通过检测进程ID是否为0...
  • WPF 防止程序次打开运行

    千次阅读 2018-01-06 10:12:56
    /// /// App.xaml 的交互逻辑 /// public partial class App : Application ...在App.xaml.cs中重写OnStartup实现,OnStartup可以做很多事情,例如:程序初始化、数据库初始化、命令行参数接收等。
  • 现在遇到一个问题:   只有第次安装的时候,用手机自带的安装系统,安装成功后点击“打开”,运行app 点击 home键,然后重新点应用的图标进入程序。 出现重新进入程序,然后退出需要退两次
  • 首次安装,出现“打开”按钮,我们点击打开按钮启动应用... 首先我们要知道,个task并不是对应个线程,实际上个task可以包含多个进程, 个Task中可能有多个同一个Activity的实例,然后这时候第一次的情况下,
  • 非常没有技术含量:打开codeblocks运行第一个你想要运行的程序,然后关掉codeblocks这时运行的程序不会关闭,再打开codeblocks运行第二你想要运行的程序就行啦~
  • 使用Mutex类可以创建有名称的互斥,而系统可以识别有名称的互斥,因此可以使用Mutex类禁止应用程序启动两次。 下面是此种场景的演示代码。 using System; using System.Threading; namespace Run1InstanceExample ...
  • 需要两次才能打开EXCEL电子表格

    千次阅读 2010-12-31 11:44:07
    近是位同事反映EXCEL表格每次必须两次才能打开。到现场同事说刚才在用OA系统,OA系统死机自动关闭后就出现了如下现象:双击(或右击打开)任一EXCEL文件时,第次总是先启动EXCEL软件,必须通过软件里的打开...
  • (转) 天快速开发一个自己的微信小程序

    万次阅读 多人点赞 2018-04-22 21:59:54
     对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。 2.先放上我做的小程序可以在微信小程序搜索“悬笔e绝”,或者用微信扫描下面的二维码哦...
  • 在开发小程序中,碰到使用web-view标签进入活动页,在返回时需要点击两次才能返回小程序,查了很多文档,通过验证找到了解决方法 1.出现原因 通过小程序社区以为也是加了#wechat_redirect导致 于是把参数去掉进行...
  • Qt实现只运行一个程序实例,即只能同时启动一个应用进程 QLockFile QSystemSemaphore QSharedMemory 前言 每次只运行应用程序一个实例可能是必要的,以限制内存泄漏的问题,或者消除某些资源,文件,SQLite数据库...
  • 问题描述:c程序中需要多调用python脚步; 初始做法:每次调用python脚步时,开始初始化python环境(Py_Initialize),...c程序调用python脚本的正确打开模式如下: 1. 在主线程中这样处理 // 初始化 Py_Initia
  • 今天和同事讨论一个文件是调用两次open是否会成功, 以及交叉读写会有什么结果?         FILE* fd1 = NULL; FILE* fd2 = NULL; char buffer1[40]; char *buffer2 = "gggggggggg"; int ret = 0, ret1; ...
  • 打开本机上的所有Excel文件时,都会自动打开一个名为“Sheet1”的未保存的空白工作簿,虽然不影响原有工作簿的使用,但是每次都要手动关闭空白的工作簿,让人很恼火。如果是打开Excel应用程序,却不会有这种情况,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 822,724
精华内容 329,089
关键字:

如何同时两次打开同一个程序