狂人呓语

VC调用外部程序后自动输入数据或者按键

湖南省医保系统需要重复的使用不同的帐号登陆,于是写了这么一个小程序。

使用VC2008 MFC开发。

下面是核心的代码,大家自己加入到程序中去。

1.在类中添加函数声明和变量

public:
    void AutoLogin(void);  //自动登陆
    void SendKeys(CString msg);  //发送按键
    void SendAscii(wchar_t data, BOOL shift);  //发送英文字符
    void SendUnicode(wchar_t data);            //发送Unicode
    CString szpath;    //存储exe路径的变量

2.添加或者编辑函数

BOOL CXXXDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码
    CString    sPath;   
    GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);   
    sPath.ReleaseBuffer();   
    int nPos;   
    nPos=sPath.ReverseFind("\\");   
    sPath=sPath.Left(nPos);
    szpath.Format("%s\\农合系统.exe",sPath);

    AutoLogin();
    AfxGetApp()->m_pMainWnd->SendMessage(WM_CLOSE);
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CXXXDlg::AutoLogin(void)
{
    STARTUPINFO si;
    memset(&si,0,sizeof(STARTUPINFO));//初始化si在内存块中的值(详见memset函数)
    si.cb=sizeof(STARTUPINFO);
    si.dwFlags=STARTF_USESHOWWINDOW;
    si.wShowWindow=SW_SHOW;
    PROCESS_INFORMATION pi;//必备参数设置结束
    CWnd  *hwnd=0;


    if(!CreateProcess(NULL,szpath.GetBuffer(MAX_PATH),NULL,    NULL,FALSE,0,NULL,NULL,&si,&pi))
    {
        AfxMessageBox("调用 沅陵县农村合作医疗管理系统 失败!");
    }
    else
    {
        TRACE("Success!");
        CString sz_WndTxt;
        //Radmin security:
        int i=0;
        while(!hwnd)
        {
            sz_WndTxt="沅陵县农村合作医疗管理系统";
            hwnd = FindWindow(NULL,(LPCTSTR)sz_WndTxt);
        }
        TRACE("找到窗口了");
        hwnd->SetForegroundWindow();
        SendKeys("Text....");        //文字或者按键
        SendKeys("\t\t\t");        //文字或者按键
        SendKeys("Text....");        //文字或者按键
        SendKeys("\n\n");        //文字或者按键
    }
}

void CXXXDlg::SendKeys(CString msg)
{
    short vk;
    BOOL shift;
    USES_CONVERSION;
    wchar_t* data = T2W(msg.GetBuffer(0));
    int len = wcslen(data);
    for(int i=0;i<len;i++)
    {
        if (data[i]>=0 && data[i]<256) //ascii字符
        {
            vk = VkKeyScanW(data[i]);
            if (vk == -1)
                SendUnicode(data[i]);
            else
            {
                if (vk < 0)
                    vk = ~vk + 0x1;
                shift = vk >> 8 & 0x1;
                if (GetKeyState(VK_CAPITAL) & 0x1)
                {
                    if (data[i]>='a' && data[i]<='z' || data[i]>='A' && data[i]<='Z')
                        shift = !shift;
                }
                SendAscii(vk & 0xFF, shift);
            }
        }
        else //unicode字符
        {
            SendUnicode(data[i]);
        }
    }
}

void CXXXDlg::SendUnicode(wchar_t data)
{
    INPUT input[2];
    memset(input, 0, 2 * sizeof(INPUT));

    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = 0;
    input[0].ki.wScan = data;
    input[0].ki.dwFlags = 0x4;//KEYEVENTF_UNICODE;

    input[1].type = INPUT_KEYBOARD;
    input[1].ki.wVk = 0;
    input[1].ki.wScan = data;
    input[1].ki.dwFlags = KEYEVENTF_KEYUP | 0x4;//KEYEVENTF_UNICODE;

    SendInput(2, input, sizeof(INPUT));
}

void CXXXDlg::SendAscii(wchar_t data, BOOL shift)
{
    INPUT input[2];
    memset(input, 0, 2 * sizeof(INPUT));

    if (shift)
    {
        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wVk = VK_SHIFT;
        SendInput(1, input, sizeof(INPUT));
    }
    input[0].type = INPUT_KEYBOARD;
    input[0].ki.wVk = data;
    input[1].type = INPUT_KEYBOARD;
    input[1].ki.wVk = data;
    input[1].ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(2, input, sizeof(INPUT));
    if (shift)
    {
        input[0].type = INPUT_KEYBOARD;
        input[0].ki.wVk = VK_SHIFT;
        input[0].ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, input, sizeof(INPUT));
    }
}

VC2008验证通过!!

未经允许不得转载:狂人呓语 » VC调用外部程序后自动输入数据或者按键

评论 52

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. Когда обычный человек сталкивается с тем что потерял ключи или замок был случайно или умышленно выведен из строя мы готовы прийти на помощь и вскрыть ваш замок. Вскрытие замков может происходить как с помощью слесарного инструмента, так и профессиональных отмычек - это зависит от типа замка, его модели и каждый наш мастер знает как работать с тем или иным видом замка. Все что вам нужно сделать - это оформить вызов и подождать некоторое время прибытия мастера по замкам. Мастер поедет к вам обязательно, в каждом районе Москвы работает по несколько мастеров по вскрытию замков от нашей компании. После вскрытия замка мы поможем вам в закупке комплектующих и установке нового более надежного замка для вашей двери.

    [url=https://po-zamkam.ru/]вскрытие электромагнитного замка[/url]

    pozamkamGok (2020-11-19) 回复
  2. софосбувир +и даклатасвир отзывы цена

    Tonyafap (2020-12-02) 回复