Hi

On 09/08/2007 07:20, Doug Cook wrote:
>> And found it.  In cs_create_connection() in if_cscope.c there is Windows
>> code that creates a new console, waits 40ms for the console to appear,
>> before hiding it.  Except under load it may take more than 40 ms, so VIM
>> fails to find and hide the console so it remains lying around.  Since it
>> is already a nasty hack (as commented) it may be ok to hack it to try up
>> to 5 times sleeping 40ms in order to find the window.  I'll have a play
>> tonight.
> 
> On Windows 2000 and later, you can use the GetConsoleWindow() function to do
> what that "nasty hack" is doing. Unfortunately, the nasty hack is necessary
> on earlier versions (I can't think of any better way, except that ideally
> the GUID would change each time), so you would have to have two code paths.
> Maybe something like this would work to use the "reliable" method wherever
> possible and the "nasty hack" if that isn't possible:
> 
> static HWND
> cs_get_console_window()
> {
>     HWND hConsole = NULL;
>     typedef HWND (WINAPI *PFGetConsoleWindow)(void);
>     HANDLE hKernel32 = NULL;
>     PFGetConsoleWindow pfGetConsoleWindow = NULL;
> 
>     hKernel32 = LoadLibrary("kernel32.dll");
> 
>     if (hKernel32)
>     {
>         pfGetConsoleWindow =
> (PFGetConsoleWindow)GetProcAddress("GetConsoleWindow");
>     }
> 
>     if (pfGetConsoleWindow)
>     {
>         hConsole = pfGetConsoleWindow();
>     }
>     else
>     {
>           /* copied from the "nasty hack" */
>           char *title;
>           title = (char *)alloc(1024);
>           if (title == NULL)
>               FreeConsole();
>           else
>           {
>               GetConsoleTitle(title, 1024); /* save for future restore */
>               SetConsoleTitle(
>                   "GVIMCS{5499421B-CBEF-45b0-85EF-38167FDEA5C5}GVIMCS");
>               Sleep(40); /* as stated in MS KB we must wait 40 ms */
>               hConsole = FindWindow(NULL,
>       
> "GVIMCS{5499421B-CBEF-45b0-85EF-38167FDEA5C5}GVIMCS");
>               SetConsoleTitle(title);
>               vim_free(title);
>           }
>     }
> 
>     if (hKernel32)
>     {
>         FreeLibrary(hKernel32);
>     }
> }
> 
> Then replace the original "nasty hack" with:
> 
> if (AllocConsole())
> {
>     consolewnd = cs_get_console_window();
>     if (consolewnd != NULL)
>         ShowWindow(consolewnd, SW_HIDE)
> }

Yep, I submitted a patch along these lines.  Unfortunately, I still 
don't think it's a solution.  I still managed to end up with a rogue 
sticky command prompt.  This was on XP SP2 so using GetConsoleWindow() - 
looks like a bug in Windows where the message is getting lost when the 
system is loaded.  Unless there is a deeper darker Windows way of 
ensuring messages don't get lost.

I'll add some debug to record if it failed to find the console handle so 
I can check the next time the window sticks again.

TTFN

Mike
-- 
You are only as good as everyone else thinks!

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui