如何在C ++中突出显示整个单词?

时间:2018-03-06 06:01:59

标签: c++ winapi

我已经制作了以下C ++程序,通过发送file=open("outputfile.txt") dataset = OCRdataset(config=config) for i in range(len(dataset)): sample = dataset[i] file.write(sample) file.close() 来突出显示键入界面中光标前的最后一个单词,然后通过发送Control+Shift+Left将其复制到剪贴板。

Control+C

当我按下#define WINVER 0x0500 #include <windows.h> #include <Winuser.h> using namespace std;int main() { // Create a generic keyboard event structure INPUT ip; ip.type = INPUT_KEYBOARD; ip.ki.wScan = 0; ip.ki.time = 0; ip.ki.dwExtraInfo = 0; while(true) { if( GetKeyState(VK_LMENU) & 0x8000 ) { Sleep(200); // Press the "Ctrl" key ip.ki.wVk = VK_CONTROL; ip.ki.dwFlags = 0; // 0 for key press SendInput(1, &ip, sizeof(INPUT)); // Press the "Shift" key ip.ki.wVk = VK_SHIFT; ip.ki.dwFlags = 0; // 0 for key press SendInput(1, &ip, sizeof(INPUT)); // Press the "Left" key ip.ki.wVk = VK_LEFT; ip.ki.dwFlags = 0; // 0 for key press SendInput(1, &ip, sizeof(INPUT)); // Release the "Left" key ip.ki.wVk = VK_LEFT; ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(INPUT)); // Release the "Shift" key ip.ki.wVk = VK_SHIFT; ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(INPUT)); // Press the "C" key ip.ki.wVk = 'C'; ip.ki.dwFlags = 0; // 0 for key press SendInput(1, &ip, sizeof(INPUT)); // Release the "C" key ip.ki.wVk = 'C'; ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(INPUT)); // Release the "Ctrl" key ip.ki.wVk = VK_CONTROL; ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(INPUT)); }}} 键时,这意味着可以正常工作。它适用于像abc或hello这样的单词,但不适用于像#abc或hello%hello这样的单词。我需要让它适用于整个单词。通过&#34;整个单词&#34;我的意思是任何不包含空格或换行符的字符集。

如果您无法完全解决我的问题,请知道我对可能有不同作用或包含某些限制的变通方法持开放态度。但我真的这样请求帮助。

请随时提出修改建议,以帮助我改进这个问题。

1 个答案:

答案 0 :(得分:0)

正如IInspectable所提到的,显然你认为是一个单词以及文本字段认为是一个单词的东西是两个不同的东西,你可以真正做任何事情。因此,您应该尝试使用FindWindowEx调用的某种组合来尝试为文本字段检索句柄(HWND),而不是尝试模拟无法获得所需内容的输入。

现在我无法准确地告诉您如何找到所需的窗口,因为我不知道它在您的系统中的位置以及它属于哪个应用程序。但是,您可以使用某些工具(例如Inspect)获取所需信息(窗口层次结构和类名称)。

之后你应该能够从文本字段中获取文本并解析它以得到第一个单词:

#include <Windows.h>

int main()
{
    /* You should adjust the following code to whatever criteria
       you are using to choose the text field */
    HWND appWindow = FindWindowEx(GetDesktopWindow(), NULL, NULL, "App window title");
    HWND editControl = FindWindowEx(appWindow, NULL, "EDIT", NULL);

    int size = GetWindowTextLength(editControl) + 1;
    char *text = new char[size];
    GetWindowText(editControl, text, size);

    int cursorPos = 0;
    SendMessage(editControl, EM_GETSEL, (WPARAM) &cursorPos, NULL);

    for (int i = cursorPos; i < size; ++i) {
        if (text[i] == ' ') {
            text[i] = '\0';
            break;
        }
    }

    char *word = &text[cursorPos];
    //do whatever you need with the word here

    delete[] text;
    return 0;
}

我没有真正有机会测试这段代码以及将文本复制到剪贴板:使用Win32 API实现这一过程似乎要复杂得多,详细描述{{3} }。