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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中突出显示整个单词?相关的知识,希望对你有一定的参考价值。

我已经制作了以下C ++程序,通过发送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));
}}}

当我按下Left-Alt键时,这意味着工作。它适用于像abc或hello这样的单词,但不适用于像#abc或hello%hello这样的单词。我需要让它适用于整个单词。 “整个单词”我的意思是任何不包含空格或换行符的字符集合。

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

请随时建议编辑,以帮助我改进这个问题。

答案

正如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实现更复杂的任务,这非常详细地描述了here

以上是关于如何在C ++中突出显示整个单词?的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围

如何突出显示 Emacs 缓冲区中所有出现的单词?

如何在IntelliJ IDEA中的特定代码块内搜索?

在 Eclipse 中突出显示文本文件中的相同单词

如何在 Visual Studio 中突出显示文本中出现的搜索词?

如何在 IntelliJ IDEA 中的特定代码块内搜索?