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
-~----------~----~----~----~------~----~------~--~---