احصل على محتويات المخزن المؤقت لوحدة التحكم في C

StackOverflow https://stackoverflow.com/questions/329309

  •  11-07-2019
  •  | 
  •  

سؤال

فقط أتساءل عما إذا كانت هناك أي طريقة (في لغة C) للحصول على محتويات المخزن المؤقت لوحدة التحكم، ويفضل أن يكون ذلك كنوع من مصفوفة الأحرف.ستتم كتابته في ملف، لذا إذا فاتني شيء غبي من شأنه أن يفعل ذلك بالضبط، فقم بالإشارة إليه.يمكن أن يكون خاصًا بنظام Windows.أنا أستخدم MinGW (دول مجلس التعاون الخليجي 3.4.5).

شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

وأعتقد أنك تحتاج إلى إلقاء نظرة على وظائف وحدة Win32 على سبيل المثال <لأ href = "http://msdn.microsoft.com/en-us/library/ms683231(VS.85).aspx" يختلط = " نوفولو noreferrer "> GetStdHandle () أو ReadConsoleOutput () أو WriteConsoleOutput الخ .

نصائح أخرى

في Win32، قراءة وحدة التحكمالإخراج:

يقرأ بيانات سمات الأحرف والألوان من كتلة مستطيلة من خلايا الأحرف في المخزن المؤقت لشاشة وحدة التحكم، وتكتب الوظيفة البيانات إلى كتلة مستطيلة في موقع محدد في المخزن المؤقت للوجهة.

إذا انها الشاشة في إطار الأوامر، ثم يحتمل أن لا، أو أي وسيلة سهلة. هل يمكن أن الإختراق في المناسبات ويندوز لتحديد جميع، نسخة، وقراءة الحافظة.

إليك طريقة لقراءة المخزن المؤقت لوحدة التحكم. GetNumCharsInConsoleBuffer هو الحصول على إجمالي الأحرف المكتوبة في المخزن المؤقت لشاشة وحدة التحكم، الذي أستخدمه GetConsoleScreenBufferInfo داخل.بعد ذلك، أقوم بإنشاء مصفوفة مخصصة ديناميكيًا بحجم يساوي القيمة السابقة التي تم إرجاعها بواسطة GetNumCharsInConsoleBuffer + 1 (للنهاية الصفرية).وأخيرا، ReadConsoleBuffer سوف يملأ المخزن المؤقت الذي تم إنشاؤه للتو بمحتويات المخزن المؤقت لشاشة وحدة التحكم.بعد ذلك، إذا كنت تريد كتابة محتويات المخزن المؤقت الخاص بك إلى ملف، فربما تحتاج إلى إجراء بعض التنسيق.مع قراءة وحدة التحكمOutputCharacter تحصل على منطقة (مستطيل) من المخزن المؤقت لشاشة وحدة التحكم.سيتم ملء الأسطر التي كتبتها في المخزن المؤقت لشاشة وحدة التحكم بمسافات لتناسب منطقة المخزن المؤقت.سيكون الأمر نفسه مع Win32 ReadConsoleOutput/WriteConsoleOutput, ، ستحصل على منطقة (مستطيل) من شاشتك.

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

DWORD GetNumCharsInConsoleBuffer()
{
    CONSOLE_SCREEN_BUFFER_INFO buffer_info = {0};
    if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &buffer_info) != FALSE)
        return (DWORD) ( (buffer_info.dwSize.X * ( buffer_info.dwCursorPosition.Y + 1)) - (buffer_info.dwSize.X - ( buffer_info.dwCursorPosition.X)) );
    else
        return 0;
}

DWORD ReadConsoleBuffer(char* buffer, DWORD bufsize)
{
    DWORD num_character_read = 0;
    COORD first_char_to_read = {0};
    if( ReadConsoleOutputCharacterA(GetStdHandle(STD_OUTPUT_HANDLE), buffer, bufsize, first_char_to_read, &num_character_read) != FALSE)
        buffer[bufsize-1] = '\0';
    else
        buffer[0] = '\0';

    return num_character_read;
}

int main(int argc, char** argv)
{
    fprintf(stdout, "Writting\nin\nthe\nbuffer\n");
    DWORD bufsize = GetNumCharsInConsoleBuffer();

    if(bufsize > 0)
    {
        bufsize++; // Add 1 for zero-ending char

        char* buffer = malloc(bufsize);
        memset(buffer, 0, bufsize);

        ReadConsoleBuffer(buffer, bufsize);  

        puts("\nBuffer contents:");
        puts(buffer);

        free(buffer);
    }

    system("pause"); 
    return 0;
}

انتاج:

Writting
in
the
buffer
Buffer contents:
Writting
in
the
buffer

Appuyez sur une touche pour continuer...

يحرر:

لقد كتبت للتو وظيفة يمكن استخدامها لكتابة محتويات المخزن المؤقت للشاشة إلى ملف.تقوم هذه الوظيفة بإزالة المسافات المبطنة من المخزن المؤقت لوحدة التحكم بالشاشة.ReadConsoleBuffer يأخذ مؤشر char فارغًا كوسيطة أولى (buffer) التي سيتم تخصيصها أثناء تنفيذها.لذلك لا تنس حذفه بنفسك. ReadConsoleBuffer سيكتب حجم المخزن المؤقت في الوسيطة الثانية (bufsize).

#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h>
#include <Windows.h>

const char* ReadConsoleBuffer(char** buffer, size_t* bufsize)
{
    CONSOLE_SCREEN_BUFFER_INFO buffer_info = {0};
    if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &buffer_info) != FALSE )
    {
        size_t data_size = (size_t) ( (buffer_info.dwSize.X * ( buffer_info.dwCursorPosition.Y + 1)) - 
                                      (buffer_info.dwSize.X - ( buffer_info.dwCursorPosition.X + 1)) );

        if(data_size > 1)
        {
            char* data = malloc(data_size); //= new char[data_size];
            _ASSERTE(data != 0);

            DWORD num_char_read;
            COORD first_char_read = {0};
            if( ReadConsoleOutputCharacterA(GetStdHandle(STD_OUTPUT_HANDLE), data, data_size, first_char_read, &num_char_read) != FALSE )
            {
                data[data_size-1] = '\0';

                const char* const pbeg = &data[0];
                const char* const pend = &data[data_size-1];
                char* pcur, *pmem;

                const int line_size = buffer_info.dwSize.X;
                int line_count = buffer_info.dwCursorPosition.Y;

                if(buffer_info.dwCursorPosition.X > 0) // No new line char at the end of the last line, so no padded spaces. 
                {                    
                    if((line_count + 1) > 1)
                    {
                        pmem = &data[data_size - buffer_info.dwCursorPosition.X - 1];
                        pcur = (pmem - 1);
                    }
                    else // 1 line and no new line char(no padded spaces). Will no enters the loop.
                        pcur = &data[0];
                }
                else 
                {
                    pcur = &data[data_size-2];
                    pmem = 0;
                }

                if(pcur != pbeg)
                {
                    while(1)
                    {
                        line_count--;

                        while(*pcur == ' ') { pcur--; }
                        *(pcur + 1) = '\n'; // Padded spaces replaced by new line char.

                        if(!pmem) // first round. Add zero-ending char.
                            *(pcur + 2) = '\0'; 
                        else
                            memmove(pcur + 2, pmem, (pend - pmem) + 1);

                        if(line_count == 0)
                            break;

                        pmem = &data[line_count * line_size];
                        pcur = (pmem - 1);
                    }
                }

                *bufsize = strlen(data) + 1;

                *buffer = malloc(*bufsize); //= new char[*bufsize];
                _ASSERTE(*buffer != 0);

                memcpy(*buffer, data, *bufsize);
                free(data); //delete[] data;

                pcur= *buffer;
                return pcur;
            }

            if(data)
                free(data); // delete[] data;
        }
    }

    *buffer = 0;
    return 0;
}


int main(int argc, char** argv)
{
    printf("Writting\nin\nthe\nbuffer");

    char* buffer;
    size_t size;  
    ReadConsoleBuffer(&buffer, &size);

    if(buffer)
    {
        freopen("out.txt", "w", stdout); 
        fprintf(stdout, buffer);
        free(buffer);
        fclose(stdout);
    }  

    return 0;
}

الإخراج في "out.txt":

Writting
in
the
buffer
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top