WinAPI从“编辑控件”中检索文本

时间:2016-02-04 23:14:31

标签: c++ winapi

这个问题让我把头发拉出来

我已阅读有关此主题的每一个Q A,每个人都有相同的解决方案,但它永远不会最终为我工作。我的结论是,因为我是新手,所以我必须遗漏一些在其他答案中没有提到的完全明显的东西,所以请尽可能详细地回答。

我使用WinAPI在C ++中有一个程序。我有一个名为hwnd的窗口,这个窗口有2个按钮和2个Edit Control文本框。我现在要做的就是获取在文本框中输入的文本并将其保存到.txt文件中。

各种答案(以及微软网站)已经说过要用

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

或GetWindowText(editcontroltag,buffer,size)

等等。我已经尝试了所有这些,并且代码编译没有问题,但是我永远无法在文本框中实际检索文本。它要么是空的,要么是一些胡言乱语(我试过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;
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

只需阅读docs fpr WM_GETTEXT消息,而不是阅读“每个Q&amp; A”。

  

的wParam

     

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

您正在为0传递wParam,因此控件不会将任何文本复制到您的缓冲区中,并且您将保留原始内容 - 因为您从未初始化内存 - 是垃圾

答案 2 :(得分:0)

只需使用ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true; SetWindowText,就像这样:

GetWindowText