Re: alt+F not working after calling pg_dump - Mailing list pgsql-general

From Andrus
Subject Re: alt+F not working after calling pg_dump
Date
Msg-id djnkb7$spc$1@news.hub.org
Whole thread Raw
In response to Re: alt+F not working after calling pg_dump  ("Magnus Hagander" <mha@sollentuna.net>)
List pgsql-general
>> Any idea how to make Alt key to work in my application
>> immediately after calling pg_dump ?
>
> What parameters do you pass to CreateProcess()?

I use modified Ed Rauh API_APP class. Relevant part of of the calling code:

 * This API call does the work.  The parameters are as follows:
 *  lpszModuleName - ptr-> file name of module to execute.  Since we aren't
launching .CPLs, do not use
 *  lpszCommandLine - ptr-> command to execute, as passed in method
 *  lpSecurityAttributesProcess - ptr-> SECURITY_ATTRIBUTES structure for
Process.  Pass a null pointer
 *  lpSecurityAttributesThread - ptr-> SECURITY_ATTRIBUTES structure for
first thread.  Pass a null pointer
 *  bInheritHandles - whether or not chlid inherits parent handles.  Since
no SECURITY_ATTRIBUTES passed, default to FALSE
 *  dwCreateFlags - Process Creation Mode flag set.  we use the default mode
at normal priority, ie 0
 *  lpvEnvironment - ptr-> a set of environment strings as if a MULTI_SZ.
We don't set, so pass a null pointer
 *  lpszStartupDir - ptr-> the starting directory.  If none provided to
method, pass a null pointer
 *  lpStartInfo - ptr-> a STARTUPINFO structure.  We use one structure
member at times.
 *  lpProcessInfo - ptr-> a PROCESS_INFORMATION structure, used to return
PID/PHANDLE detail.  We use one member

 DECLARE SHORT CreateProcess IN WIN32API AS CrPr ;
  STRING lpszModuleName, ;
  STRING @lpszCommandLine, ;
  STRING lpSecurityAttributesProcess, ;
  STRING lpSecurityAttributesThread, ;
  SHORT bInheritHandles, ;
  INTEGER dwCreateFlags, ;
  STRING @lpvEnvironment, ;
  STRING lpszStartupDir, ;
  STRING @lpStartInfo, ;
  STRING @lpProcessInfo

 * Make default Structures for the CreateProcess call
 *
 * ProcessInfo - 4 bytes, a Process handle, a Thread Handle, a (DWORD)
ProcessId and a (DWORD) ThreadID
 *     we save the Process handle and return it to caller in
tnReturnProcessHandle

 cProcessInfo = REPL(CHR(0),16)

 * StartUpInfo is a 68 byte long complex structure;  we either have 68 bytes
with a cb member (byte 1) 68
 * or with cb of 68, dwFlag low order byte (byte 45) of 1, and low order
byte wShowWindow (byte 49) set to
 * the SW_ value appropriate for the Window Mode desired.

  * Use default of application
  cStartUpInfo = CHR(68) + REPL(CHR(0),67)

 LOCAL cstr

 cstr= 'PGPASSWORD=xxx' +CHR(0)+ ;
'HOMEPATH='+GETENV('HOMEPATH') +CHR(0)+ ;
'SystemDrive='+GETENV('SystemDrive')+CHR(0)+ ;
'SystemRoot='+GETENV('SystemRoot')+CHR(0)+ ;
'USERDOMAIN='+GETENV('USERDOMAIN')+CHR(0)+ ;
'USERNAME='+GETENV('USERNAME')+CHR(0)+ ;
'USERPROFILE='+GETENV('USERPROFILE')+CHR(0)+ ;
'windir'+GETENV('windir')+CHR(0)+ CHR(0)

 lResult = CrPr( 0, ;
     cCommandLine, ;
     0, 0, 0, 0, @cstr, ;
     uFromDir, ;
     @cStartUpInfo, ;
     @cProcessInfo)

> I think you're bit by the general windows behaviour that a new process
> started by default will take focus away from your app, and it does not
> necessarily return it when it quits.

I'm not sure that this is the reason because:

1. I changed commandline parameter to  c:\wind98\system32\chcp.com .  In
this case, Alt+F works.
2. Other keys like Enter, Ctrl+K works in my application.
3. After calling pg_dump I tried BringWindowToFront procedure below as
described in
http://www.tek-tips.com/faqs.cfm?fid=4262
This does not fix the problem.

> I don't *think* it's pg_dump
> specific. It'd be interesting to know both about flags above, and also
> what happens if you just call a bat-file that does nothing and then
> exits.

Specifiing empty .bat file directly as CreateProcess() command line causes
Createprocess to return error.
I tried to run chcp.com (randomly seleted windows console app which does not
wait for user input).
After chcp.com finishes , Alt+F works.

Andrus.

* http://www.tek-tips.com/faqs.cfm?fid=4262
* Force Window to Front (not blink in taskbar)

* You may have noticed that when you try and bring your application's
* window to the front using API calls (SetForeGroundWindow and
* BringWindowToTop) that it just blinks down in the taskbar.  This
* applies to Windows 2000 and later Microsoft OS's (see MS
* Documentation below).  Well, if you would rather have your
* applicaiton's window truly come to the front (and I'm sure you do)
* then here's a VFP workaround using API calls.

* MS Documentation for SetForegroundWindow reads as follows:
* "Windows NT 5.0 and later: An application cannot force a window to the
* foreground while the user is working with another window. Instead,
* SetForegroundWindow will activate the window (see SetActiveWindow)
* and call the FlashWindowEx function to notify the user."
* ...and it appears that the same is true for BringWindowToTop.

* The only way Windows 2000 and Windows XP let you bring your
* application's window up to the front is if the thread it is running on
* is the thread of the foreground window at the time.  So, you have to
* attach the thread of your application to the thread of the foreground
* window and then bring your application's window to the front.  After
* that you need to detach your thread (this all only happens if the user
* has another application's window as the foreground active window).
* It looks like a lot, but really we are just tricking Windows into
* thinking that our application window is part of the foreground
* application so that it will let us bring our window up to the front
* rather than having it just blink in the taskbar.  The key to this
* whole thing is the AttachThreadInput API calls.

DECLARE Long FindWindow In Win32API String, String

LOCAL nHWND, ccaption
ccaption = _screen.caption
_screen.caption = SYS(2015)
nHWND = FindWindow(Null,_screen.caption)
_screen.Caption = m.ccaption

If nHWND >0
  ForceForegroundWindow(nHWND)
  ENDIF
RETURN

PROCEDURE ForceForegroundWindow(lnHWND)

LOCAL nForeThread, nAppThread
DECLARE Long BringWindowToTop In Win32API Long
DECLARE Long ShowWindow In Win32API Long, Long

    DECLARE INTEGER GetCurrentThreadId;
        IN kernel32

    DECLARE INTEGER GetWindowThreadProcessId IN user32;
        INTEGER   hWnd,;
        INTEGER @ lpdwProcId

    DECLARE INTEGER GetCurrentThreadId;
        IN kernel32

    DECLARE INTEGER AttachThreadInput IN user32 ;
        INTEGER idAttach, ;
        INTEGER idAttachTo, ;
        INTEGER fAttach

    DECLARE INTEGER GetForegroundWindow IN user32

nForeThread = GetWindowThreadProcessId(GetForegroundWindow(), 0)
nAppThread = GetCurrentThreadId()

IF nForeThread != nAppThread
  * ? 'Different threads'

  AttachThreadInput(nForeThread, nAppThread, .T.)
  BringWindowToTop(lnHWND)
  ShowWindow(lnHWND,3)
  AttachThreadInput(nForeThread, nAppThread, .F.)
 ELSE
  * ? 'same threads'
  BringWindowToTop(lnHWND)
  ShowWindow(lnHWND,3)
  ENDIF
ENDPROC



pgsql-general by date:

Previous
From: "Qingqing Zhou"
Date:
Subject: Win32 libpq and ecpg thread safety
Next
From: Oliver Elphick
Date:
Subject: Re: function DECODE and triggers