加载中…
个人资料
吴超
吴超
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,309,414
  • 关注人气:210
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

VC调用外部函数命令以及net调用系统软键盘(兼容win7及win10)[转]

(2020-09-11 08:36:05)
标签:

vc调用外部函数命令

net调用系统软键盘

兼容win7及win10

分类: 代码天地
WinExec,ShellExecute ,CreateProcess

可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。

    WinExec 两个参数,前一个指定路径,后一个指定显示方式。
    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
    CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。


一 3个SDK函数( WinExec、ShellExec、CrateProcess )的语法
 

1 WinExec

这个函数最简单,只有两个参数,原型如下:

 
      UINT WinExec(
      LPCSTR lpCmdLine,   // 命令路径
      UINT uCmdShow      // 显示方式
      )

使用方法如下:

WinExec("Notepad.exe", SW_SHOW);  // 打开记事本
WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。
 

2 ShellExecute

原型如下:

      HINSTANCE ShellExecute(
      HWND hwnd,           //父窗口句柄
      LPCTSTR lpOperation,   //操作, 打开方式 "edit","explore","open","find","print","NULL"
      LPCTSTR lpFile,         //文件名,前面可加路径
      LPCTSTR lpParameters,   //参数
      LPCTSTR lpDirectory,    //默认文件夹
      INT nShowCmd          //显示方式
      )

使用方法如下:

ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:/Test.txt 文件
ShellExecute(NULL, "open", "http://www.google.com",/   NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com
ShellExecute(NULL,"explore", "D://C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:/C++
ShellExecute(NULL,"print","C://Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:/Test.txt
ShellExecute不支持定向输出。
 

3 CreateProcess

原型如下:

      BOOL CreateProcess(
      LPCTSTR lpApplicationName, //执行程序名
      LPTSTR lpCommandLine,  // 参数行
      //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
      LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes
      LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes
      BOOL bInheritHandles,  // 继承标志
      DWORD dwCreationFlags, // 创建标志
      LPVOID lpEnvironment,  // 环境变量
      LPCTSTR lpCurrentDirectory,   // 运行该进程的初始目录
      LPSTARTUPINFO lpStartupInfo,  // 用于在创建子进程时设置各种属性
      LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
     

使用方法如下:
             PROCESS_INFORMATION pi;
                       STARTUPINFO si;
                       memset(&si,0,sizeof(si));
                       si.cb=sizeof(si);
                      si.wShowWindow=SW_SHOW;
                       si.dwFlags=STARTF_USESHOWWINDOW;
                       bool fRet=CreateProcess("D://putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
 

可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

  

二 关于3个SDK函数 的其他注意事项:

1、定义头文件

在头文件stdafx.h中必须定义以下两个头文件:

#include // 可替换为 windows.h
#include
如果定义了头文件 #include 的话就不必定义 #include 了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。
 
2、定义路径

C++中所表示的路径要用 " // "而不是平常所用的" / ",所以以上三个函数表示路径都为:

Disk://Directory//...//File name

WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED);

ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL);
bool fRet=CreateProcess("D://putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);





=====================





没有什么技术说明,也是查询出来的,在此做记录

public class StartKeyBoard
    {
        public static bool isShowNumBoard = false;
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
        public static void StartKeyBoardFun()
        {
            string path = "C:/Program Files/Common Files/microsoft shared/ink/TabTip.exe";
            if (File.Exists(path))
            {
                Process p = Process.Start(path);
            }
            else
            {
                //判断软键盘是否进程是否已经存在,如果不存在进行调用
                Process[] pro = Process.GetProcessesByName("osk");
                //说明已经存在,不再进行调用
                if (pro != null && pro.Length > 0)
                    return;
                IntPtr ptr = new IntPtr();
                bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr);
                if (isWow64FsRedirectionDisabled)
                {
                    Process.Start(@"C:\WINDOWS\system32\osk.exe");
                    bool isWow64FsRedirectionReverted = Wow64RevertWow64FsRedirection(ptr);
                }
            }
        }

    }









0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有