繁体   English   中英

WinAPI从编辑控件中检索文本

[英]WinAPI Retrieving text from Edit Control

这个问题使我已经把头发拔了

我已经阅读了有关此主题的每一个质量检查,每个人都有相同的解决方案,但是它永远不会对我有用。 我的结论是,由于我是新手,因此我肯定会缺少其他答案中未提及的显而易见的东西,因此请尽可能详细地回答。

我有一个使用WinAPI的C ++程序。 我有一个名为hwnd的窗口,此窗口有2个按钮和2个“编辑控件”文本框。 此时,我要做的就是将在文本框中输入的文本保存到.txt文件中。

各种答案(和Microsoft网站)都说要使用

SendMessage(editcontroltag,WM_GETTEXT,0,LPARAM缓冲区)

或GetWindowText(editcontroltag,缓冲区,大小)

和更多。 我已经尝试了所有方法,并且代码编译时没有问题,但是实际上我永远无法检索文本框中的文本。 它是空的,或有些乱码(我尝试过unicode和ansi,无论哪种方式都发生相同的事情)

乱码通常看起来像是')6或它的某种变体(对我而言不重要,因此我无法真正确定其来源。

我尝试将缓冲区转换为几乎所有允许的数据类型,并尝试检索缓冲区及其地址(该地址显示正常)。 仍然没有运气。

我将在这里为您粘贴代码,对不起,它令人难以置信的混乱,您会注意到我已注释掉许多检索文本的尝试。 无论哪种方式都没有。 每次都会显示相同的错误

谢谢

#include <windows.h>
#include <iostream>
#include <fstream>
#include <TCHAR.H>
#include <stdio.h>
//#include "C:\Users\Eric\Desktop\Documentation\resource.h"
//the following defines are for adding menus without headers or rc files
#define ID_FILE_EXIT 9001
#define ID_STUFF_GO 9002
#define IDC_MAIN_EDIT 101
#define ID_BUTTON 9003
#define ID_EDITCHILD1 100
#define ID_EDITCHILD2 102
#define BUFFER_SIZE 256

using namespace std;

const char g_szClassName[] = "myWindowClass";
BOOL authenticate(char, string);
string bufferToString(char* , int );
BOOL doit = TRUE;
 //Step 4: the Window Procedure

 /*
 Procedure to add items to the main window
 you create the item inside the WM_CREATE function thingy
 look it up online, there are many examples
 This will draw the item in the window, but will not do anything
 next you will need to go to the WM_COMMAND switch statement
 and add a case for the appropriate LWORD of your item

kapish?

 */

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndEDUSER;
    static HWND hwndEDPASS;

    //TCHAR lpszLatin[] =  "Lorem ipsum dolor sit amet, consectetur ";
UpdateWindow(hwnd);
    switch(msg)
    {
        case WM_SIZE:
        {
            HWND hEdit;
            RECT rcClient;

            GetClientRect(hwnd, &rcClient);

            hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
            SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
        }
        break;
        case WM_CREATE:
        {
            HMENU hMenu, hSubMenu;
            HICON hIcon, hIconSm;
            HINSTANCE hInstance;

            if(doit)
                {
            HWND hwndEDUSER = CreateWindowEx(
                                 0,"EDIT",   // predefined class
                                NULL,         // no window title
                                WS_CHILD | WS_VISIBLE |
                                ES_LEFT | ES_MULTILINE ,
                                60, 60, 100, 25,   // set size in WM_SIZE message
                                hwnd,         // parent window
                                (HMENU) ID_EDITCHILD1,   // edit control ID
                                (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
                                NULL);        // pointer not needed

            // Add text to the window.
            SendMessage(hwndEDUSER, WM_SETTEXT, 0, (LPARAM)("username"));
            //SendMessage(hwndEdit, EM_SETLIMITTEXT, 3, NULL);

            HWND hwndEDPASS = CreateWindow(
                                 "EDIT",   // predefined class
                                NULL,         // no window title
                                WS_CHILD | WS_VISIBLE |
                                ES_LEFT,
                                60, 90, 100, 25,   // set size in WM_SIZE message
                                hwnd,         // parent window
                                (HMENU) ID_EDITCHILD2,   // edit control ID
                                (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
                                NULL);        // pointer not needed

            // Add text to the window.
            SendMessage(hwndEDPASS, WM_SETTEXT, 0, (LPARAM)("password"));
            //SendMessage(hwndEdit, EM_SETLIMITTEXT, 3, NULL);


            HWND hwndButton = CreateWindow(
            "BUTTON",  // Predefined class; Unicode assumed
            "Commit",      // Button text
            WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles
            200,         // x position
            10,         // y position
            200,        // Button width
            25,        // Button height
            hwnd,     // Parent window
            NULL,       // No menu.
            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
            NULL);      // Pointer not needed.


            HWND boobs = CreateWindow(
            "BUTTON",  // Predefined class; Unicode assumed
            "LOG IN",      // Button text
            WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles
            200,         // x position
            35,         // y position
            200,        // Button width
            25,        // Button height
            hwnd,     // Parent window
            (HMENU)ID_BUTTON,       // PREVIOUS COMMENT SAID NO MENU, HOWEVER THIS IS WHERE I ADD THE ID FOR THE BUTTON BEING PRESED
            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
            NULL);      // Pointer not needed.
                }

           // HWND hWndExample = CreateWindow("EDIT", "Text Goes Here", WS_VISIBLE | WS_CHILD | ES_CENTER, 10,10,100,100, hwnd, NULL, hInstance, NULL);


            hMenu = CreateMenu();

            hSubMenu = CreatePopupMenu();
            AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File");

            hSubMenu = CreatePopupMenu();
            AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "&Go");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Stuff");

            SetMenu(hwnd, hMenu);

            hIcon = static_cast<HICON>(LoadImage(NULL, "C:\menu_one.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE));
            if(hIcon)
                SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
            else
                MessageBox(hwnd, "Could not load large icon!", "Error", MB_OK | MB_ICONERROR);


            hIconSm = static_cast <HICON>(LoadImage(NULL, "C:\menu_two.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE));
            if(hIconSm)
                SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
            elsehttp://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v=VS.85).aspx
                MessageBox(hwnd, "Could not load small icon!", "Error", MB_OK | MB_ICONERROR);

        }
        break;

        /*case WM_LBUTTONDOWN: //mouse click
        case BN_CLICKED:
        {
            char szFileName[MAX_PATH];
            HINSTANCE hInstance = GetModuleHandle(NULL);

            GetModuleFileName(hInstance, szFileName, MAX_PATH);
            MessageBox(hwnd, "The document has been requested, and will be available shortly", "Document Requested", MB_OK | MB_ICONINFORMATION);
        }*/
        break;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case ID_FILE_EXIT:
                    PostMessage(hwnd, WM_CLOSE, 0, 0);
                break;
                case ID_STUFF_GO:
                    MessageBox(hwnd, "Unavailable", "title", MB_OKCANCEL | MB_ICONINFORMATION );
                break;
                case ID_BUTTON:
                    {

                        //TCHAR user[BUFFER_SIZE];
                        //string user ="";
                        //static char user[256];
                        //char id[256];
                        //((WORD*)user)[0] = BUFFER_SIZE; //cast variable user of type TCHAR into WORD. Set position 0 of said WORD variable to BUFFER_SIZE (needed by EM_GETLINE)
                       // SendMessage(hwndEDUSER, EM_GETLINE, 0, (LPARAM)user);

                        // Edit_GetText(hwndEDUSER,(LPTSTR) user,BUFFER_SIZE);

                        //GetWindowText(hwndEDUSER, (LPSTR)user, 256);
                        //GetDlgItemText(hwndEDUSER, ID_EDITCHILD1, (LPTSTR)user,BUFFER_SIZE);
                        //const char id= *user;

                        int len = SendMessage(hwndEDUSER, WM_GETTEXTLENGTH, 0, 0);
                        char* buffer = new char[len];
                        UpdateWindow(hwnd);
                        SendMessage(hwndEDUSER, WM_GETTEXT, 0, (LPARAM)buffer);
                        //return buffer;
                        string user(buffer);
                        fstream users;
                        users.open("C:\\users\\Eric\\Desktop\\Documentation\\user1.txt");
                        users << user;
                        users.close();
                        doit = FALSE;
                        //PostMessage(hwnd, WM_PAINT, 0, 0);
                        UpdateWindow(hwnd);
                        //char id = (char)user;
                       /* Edit_GetText(hwndEDUSER, (LPTSTR)eyeD,50);
                       string id(eyeD);
                        if(id=="2"){MessageBox(hwnd, "BITTCH", "Document Requested", MB_OK | MB_ICONINFORMATION);} */

                        //string id = (string)user;
                       // authenticate(id, "");
                        //char szFileName[MAX_PATH];
                        //HINSTANCE hInstance = GetModuleHandle(NULL);

                        //GetModuleFileName(hInstance, szFileName, MAX_PATH);
                        MessageBox(hwnd,buffer, "Title", MB_OK | MB_ICONINFORMATION);
                    }
                break;
              /*  case BN_CLICKED:
                    {
                    char szFileName[MAX_PATH];
                    HINSTANCE hInstance = GetModuleHandle(NULL);

                    GetModuleFileName(hInstance, szFileName, MAX_PATH);
                    MessageBox(hwnd, "Commit", "Document Requested", MB_OK | MB_ICONINFORMATION);
                    }
                break;*/
            }
        break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        /*case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // All painting occurs here, between BeginPaint and EndPaint.

            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

            EndPaint(hwnd, &ps);
        }*/
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
    //Step 1: Registering the Window Class;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); //comment this out for header and rc
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_INACTIVEBORDER);//(HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); //comment this out for header and rc
    //wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU); //comment this out for header and rc
    //wc.hIcon  = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    //wc.hIconSm  = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "nameofwin",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 600, 480,
        NULL, NULL, hInstance, NULL);
    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0) //this piece of code is responsible for collecting events (clicks.. etc) and reporting them to the window
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

BOOL authenticate(char uid, string pwd)
{
    //string boobs=uid;
    fstream users;
    users.open("C:\\users\\Eric\\Desktop\\Documentation\\user1.txt");
    users << uid;
    users.close();
    return TRUE;
}

您正在为句柄HWND hwndEDUSER声明一个静态变量。 但是在创建窗口时,您没有使用该变量。 您正在声明一个新的,它超出范围并丢失。 稍后,您将使用静态变量...,其中没有任何内容。

而不是阅读“每一个问答”,只需阅读WM_GETTEXT消息中的文档即可

wParam中

要复制的最大字符数,包括终止的空字符。

您为wParam传递了0 ,因此控件没有将任何文本复制到缓冲区中,并且留下了原始内容,因为您从未初始化过内存,所以这是垃圾。

只需使用SetWindowTextGetWindowText ,就像这样:

/* Set the window text */
SetWindowText(hwndEDUSER, _T("username"));

/* Get the window text */
TCHAR *buf;
int len;

if((buf=malloc(len=((GetWindowTextLength(hwndEdit)+1)*sizeof (TCHAR)))!=NULL)
    GetWindowText(hwndEdit, buf, len);
/* Use buf */
free(buf);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM