Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Met AllocConsole blijft programma actief.

  1. #1

    Met AllocConsole blijft programma actief.

    Ik heb een probleem met onderstaande code. Als ik met verkenner klik op de exe werkt alles goed. Maar als ik het programma start vanuit een “dos box” dat blijft het programma actief in de task list na een KeyPressed. Het programma verdwijnt pas uit de task list als ik de “dos box” sluit :-(

    Code:
    program test;
    
    uses
      Windows;
    
    const
      ATTACH_PARENT_PROCESS = DWORD(-1);
    
    
    function AttachConsole(ProcessId: DWORD): BOOL; stdcall;
      external 'kernel32.dll' name 'AttachConsole';
    
    {$R *.RES}
    
    function KeyPressed:Boolean;
    var
      lpNumberOfEvents     : DWORD;
      lpBuffer             : TInputRecord;
      lpNumberOfEventsRead : DWORD;
      nStdHandle           : THandle;
    begin
      Result:=false;
      //get the console handle
      nStdHandle := GetStdHandle(STD_INPUT_HANDLE);
      lpNumberOfEvents:=0;
      //get the number of events
      GetNumberOfConsoleInputEvents(nStdHandle,lpNumberOfEvents);
      if lpNumberOfEvents<> 0 then
      begin
        //retrieve the event
        PeekConsoleInput(nStdHandle,lpBuffer,1,lpNumberOfEventsRead);
        if lpNumberOfEventsRead <> 0 then
        begin
          if lpBuffer.EventType = KEY_EVENT then //is a Keyboard event?
          begin
            if lpBuffer.Event.KeyEvent.bKeyDown then //the key was pressed?
              Result:=true
            else
              FlushConsoleInputBuffer(nStdHandle); //flush the buffer
          end
          else
          FlushConsoleInputBuffer(nStdHandle);//flush the buffer
        end;
      end;
    end;
    
    
    begin
      if not AttachConsole(ATTACH_PARENT_PROCESS) then
        AllocConsole;
    
      Writeln('test');
    
      repeat
        sleep(10);
      until KeyPressed;
    
    end.
    De vraag is hoe kan ik het programma direct vrijgeven na de KeyPressed.
    Niets is zo gemakkelijk als het lijkt.

  2. #2
    Het lijkt erop dat je na zowel AllocConsole als AttachConsole ook FreeConsole aan moet roepen als je de console niet meer nodig hebt. Wellicht helpt dat.

    Die moet je dan aanroepen na de loop / voor de end.
    1+1=b

  3. #3
    Dat had ik ook al geprobeerd. Maar dat maakt niet helaas niet uit.
    Niets is zo gemakkelijk als het lijkt.

  4. #4
    Zet binnen je repeat eens een write('.');
    Zie je de puntjes dan nog steeds verschijnen?
    Ook na de key indrukken?

    Wellicht blijft die keypressed gewoon false.
    (Je hebt n.l. wel je output device attached maar ik vraag me af of dat voor input ook zo is)

    Of maak er eens een readln; van en dan de enter gebruiken.

  5. #5
    Ah, je hebt gelijk. keypressed blijft false :-( tenmiste hij blijft in de loop.
    Wel gek dat als je direct op de exe klikt hij wel stopt na keypress
    Niets is zo gemakkelijk als het lijkt.

  6. #6
    Ik kom net tot de ontdekking dat de functie KeyPressed die ik gebruik meer gekke dingen doet. Moet dus iets anders bedenken wat wel werkt. Readln is helaas geen optie. Het is onderdeel van een groter geheel ik echt KeyPress nodig heb.
    Niets is zo gemakkelijk als het lijkt.

  7. #7
    Je kunt even neuzen in de windows implementatie van FreePascal's crt unit?

    Bart

  8. #8
    Mijn probleem zit hem in combinatie met de AllocConsole. Als ik een "echt" {$APPTYPE CONSOLE} programma maak gaat de KeyPressed wel goed.
    Niets is zo gemakkelijk als het lijkt.

  9. #9
    Quote Originally Posted by Greta View Post
    Mijn probleem zit hem in combinatie met de AllocConsole. Als ik een "echt" {$APPTYPE CONSOLE} programma maak gaat de KeyPressed wel goed.
    Ja, maar dan werkt het niet meer als je echt als Windows programma op wilt starten.
    Maar als je geen combinatie van Windows en Console nodig hebt werkt dat wel goed.

    Anders is het even kijken wat nStdHandle is (is er wel een goede STD_INPUT_HANDLE) en wat lpNumberOfEvents is.

  10. #10
    Het werkt op mijn PC. Zowel met als zonder {$APPTYPE CONSOLE}. Ik zie in de debugger dat AllocConsole of AttachConsole wordt gebruikt afhankelijk van de aanwezigheid van die regel. Ook buiten de debugger werkt het.

    Ik gebruik Delphi 10.3, Rio, op Windows 10, al kan ik me haast niet voorstellen dat dat in dit geval veel uitmaakt.
    1+1=b

  11. #11
    ik zou die sleep(10) in die loop er als eerste eruit slopen en dan nog eens kijken wat er gebeurt. Of gaat iedereen er van uit dat de keybuffer gevuld wordt terwijl de app continue in sleep is?

  12. #12
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,240
    Mogelijk dat sommige settings van de cmd box invloed hebben (zoals mouse editing?) command.com vs cmd.exe vs powershell?

  13. #13
    @GolezTrol: Dat is gek dat hij het bij jouw wel goed doet. Ik heb het getest in Delphi 5, 7 en 2010 op Windows 10. Bij alle versie blijft het programma in het geheugen als ik het open vanuit een dos box. En verdwijnt pas uit het geheugen als ik de dos box sluit. :-(

    @Miep: Net even getest. Dan hij het het helaas ook niet.

    Er zit verschil in het afhandelen op het moment dat er door het programma zelf een dos scherm geopend wordt of dat je het programma start vanuit een dos box. En voor de waarom heb ik de logica nog niet kunnen vinden.
    Niets is zo gemakkelijk als het lijkt.

  14. #14
    Heb je al gekeken wat de waardes van die nStdHandle en lpNumberOfEvents is?

    Kwestie van even wat writeln erin zetten om te debuggen.

    Hier overigens eenzelfde probleem.
    https://microsoft.public.win32.progr...prompt-console

    Kan best zijn dat je met attachconsole niet de keydowns krijgt.
    Je zou kunnen kijken of je wel andere events krijgt.
    Last edited by rvk; 13-Apr-21 at 17:37.

  15. #15
    As je rechtstreeks op de exe klikt:
    nStdHandle: 380
    lpNumberOfEvents: 0 en telt op als je op toetsen klikt

    Als je de exe vanuit een dos box start.
    nStdHandle: 380
    lpNumberOfEvents: 0 en blijft 0 ook als je op toetsen klikt :-(
    Niets is zo gemakkelijk als het lijkt.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •