锁定多线程pywinauto发送密钥

时间:2019-03-27 13:18:30

标签: python pywinauto concurrent.futures

我是pywinauto的新手,我正在创建几个记事本窗口,并在所有窗口中键入文本。但是,这并不相互依赖,因此可以使用线程同时运行。

但是,当我尝试执行相同操作时,文本混乱了,因为有多个线程试图同时访问type_keys()方法。有什么办法可以同时实现相同目标吗?

2 个答案:

答案 0 :(得分:2)

还有另一种方法.set_text("..."),它不需要窗口成为焦点。仅适用于编辑框。

.type_keys().click_input()对于并发自动化或锁定的计算机/ RDP最小化不是一个很好的选择。可以在Remote Execution Guide中找到更多详细信息。

答案 1 :(得分:1)

您也可以尝试从pywinauto导入keybord,并且您要发送的发送行是一个小例子:

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <stack>

using namespace std;

string trim(const string& str)
{
    size_t first = str.find_first_not_of(' ');
    if (string::npos == first)
    {
        return str;
    }
    size_t last = str.find_last_not_of(' ');
    return str.substr(first, (last - first + 1));
}

vector<string> split(const std::string& str, char delim = ' ')
{
    vector<string> elements;
    stringstream ss(str);
    string token;
    while (getline(ss, token, delim)) {
        elements.push_back(token);
    }

    return elements;
}

double evaluate(string operation)
{
    vector<string> values = split(operation, ' ');
    vector<string> result_vector;
    double result = 0;

    for(unsigned int i = 0; i < values.size(); i++){
        if(values[i] == "*"){
            double mini_result = stod(result_vector.back()) * stod(values[i+1]);
            result_vector.pop_back();
            i++;
            result_vector.push_back(to_string(mini_result));
        }
        else if(values[i] == "/"){
            double mini_result = stod(result_vector.back()) / stod(values[i+1]);
            result_vector.pop_back();
            i++;
            result_vector.push_back(to_string(mini_result));
        }
        else{
            result_vector.push_back(values[i]);
        }
    }

    auto iterator = result_vector.begin();
    while(iterator != result_vector.end()){
        if(*iterator == "-"){
            iterator++;
            result -= stod(*iterator);
        }
        else if(*iterator == "+"){
            iterator++;
            result += stod(*iterator);
        }
        else{
            result += stod(*iterator);
        }
        iterator++;
    }
    return result;
}


int main()
{
    cout<<evaluate("5 * 44 + 3 / 2 * 4 - 12");
}

使用此代码,您将打开Notepade并在记事本中打个招呼,我刚刚创建为.py文件,并且两者都具有相同的代码,并且确实在主文件上调用了它们,并且工作完美 我创建了A.py并在上面放了代码,然后我创建了B.py并放了相同的代码,在C.py中,我导入了A,导入了B并运行了它,它确实打开了2 Notpad并为该示例编写了文本外观: A.py

from pywinauto import application
from pywinauto import keyboard 
app = application.Application()
app.start("Notepad.exe")
keyboard.SendKeys('hello')

B.py

from pywinauto import application
from pywinauto import keyboard 
app = application.Application()
app.start("Notepad.exe")
keyboard.SendKeys('hello')

C.py

from pywinauto import application
from pywinauto import keyboard 
app = application.Application()
app.start("Notepad.exe")
keyboard.SendKeys('hello friends',with_spaces=True)

运行C.py使所有文件保存在同一文件夹中