C++ 和 WinApi - 使用 GetWindowText() 获取 C++ 代码的参数

标签 c++ winapi file-io

我编写了一些 C++ 控制台程序,可以将一种文件类型转换为另一种文件类型。我需要将控制台应用程序变成一个窗口应用程序。我从来没有制作过窗口应用程序。我选择了 WinApi,因为我没有太多时间,也不想更改 IDE (DEV C++ 5.10)、编译器/链接器设置等。我需要一个简单的小窗口。我需要从用户那里得到的参数是:输入文件的路径,输出文件的名称和路径,以及两个double类型的参数。我已经开始试验,想把窗口中的文本放到一个 .txt 文件中。问题是我在 .txt 文件中得到了什么。我的代码:

#include <windows.h>
#include <string>
#include <fstream>
#include <iostream>

using namespace std;

HWND g_hText;

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {

        case WM_CLOSE:
        {
            DestroyWindow( hwnd );
        }
        break;

        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }

        //here I create the file and write to it
        case WM_COMMAND:
        {   if(( HWND ) lParam == g_hText )
            {   DWORD dlugosc = GetWindowTextLength( g_hText );
                LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                GetWindowText( g_hText, Bufor, dlugosc + 1 );

                ofstream out("some_file.txt",ios_base::app);
                out<<Bufor;
                out.close();
            }
            break;  
        }

        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);

        }

    return 0;
    }

    MSG msg;

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc;
    HWND hwnd;

    memset(&wc,0,sizeof(wc));//sprawdzic co to
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra = 0;
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);

    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        640,
        480,
        NULL,NULL,hInstance,NULL);

    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }

    g_hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
    200, 0, 150, 30, hwnd, NULL, hInstance, NULL );

    while(GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg); 
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

例如,当我在文本窗口中键入“qwerty”时,我会在文本文件中得到“qqqwqwqweqweqwerqwerqwertqwertqwertyqwertyqwerty”。不断阅读窗口中的文本。我试图在按下“Enter”后让它被阅读

case WM_COMMAND:
{   if(( HWND ) lParam == g_hText )
    {    if(WM_KEYDOWN)
        {    if(VK_RETURN)
            {   DWORD dlugosc = GetWindowTextLength( g_hText );
                LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                GetWindowText( g_hText, Bufor, dlugosc + 1 );

                ofstream out("some_file.txt",ios_base::app);
                out<<Bufor;
                out.close();
            }
            break;  
        }

        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);

        }
    }
}

但没有效果。应该怎样做才能做好?

最佳答案

您需要正确处理 WM_KEYDOWN,而不是 WM_COMMAND,因为 windows 在按下键后收到 WM_KEYDOWNWM_COMMAND 经过各种事件。

case WM_KEYDOWN:
{   
    if(wParam == VK_RETURN)
    {   
        DWORD dlugosc = GetWindowTextLength( g_hText );
        LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
        GetWindowText( g_hText, Bufor, dlugosc + 1 );

        ofstream out("some_file.txt",ios_base::app);
        out<<Bufor;
        out.close();
    }
    break;  
}

此外,

if(WM_KEYDOWN)
if(VK_RETURN)

这两行基本上是 if (true) 并且不要忘记释放分配的内存。

关于C++ 和 WinApi - 使用 GetWindowText() 获取 C++ 代码的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30803308/

相关文章:

Haskell:为什么这段代码会失败?

c++ - Borland C++ 异常

c# - 覆盖标题栏按钮的工具提示文本(关闭、最大化、最小化、帮助)

c++ - Media Foundation 获取视频文件的确切帧(样本)计数

ruby - 如何在 Ruby 中一次读取一个文件字节?

cocoa - 使用 NSData 方法 "writeToFile:atomically:"时如何保留文件名中的冒号字符?

c++ - C++ 中的 new 返回 (void *) 吗?

c++ - 递归地反转字符串中的单词

c++ - 在 Visual Studio 调试中检查 STL 容器

C++ : Data retrieved from MySQL table in win32 applications