Hallo Markus,
die Messagebox kann ich auch erst sehen, nachdem ich das Editorfenster verkleiner, verschiebe, in den Hintergrund bringe oder schließe. Aber es wird gleich nach dem Editorstart ausgegeben, nur eben hinter dem Editfenster.
Von FritzFax habe ich keine Ahnung, aber ich habe das Programm etwas erweitert, damit es mit keybd_event mal einen Text in das „Unbenannte – Editor“ – Fenster schreibt.
Code: Alles auswählen
******************************************************
#include "dll.ch"
#include "bap.ch"
#include "Appevent.ch"
#include "Xbp.ch"
#define KEYEVENTF_KEYUP 0x02
#define VK_SHIFT 0x10
#define SW_NORMAL 1
#pragma Library( "XbtBase1.lib" )
#pragma Library( "XbtBase2.lib" )
*-----------------------------------------------------
DLLFUNCTION EnumWindows( lpEnumFunc, lParam ) USING OSAPI FROM user32.dll
DLLFUNCTION GetWindowTextA( hwnd, @lpString, nMaxCount ) USING OSAPI FROM user32.dll
DLLFUNCTION BringWindowToTop( nHwnd ) USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd ) USING STDCALL FROM USER32.DLL
DLLFUNCTION ShowWindow( hwnd, nCmdShow ) USING STDCALL FROM USER32.DLL
DLLFUNCTION VkKeyScanA( cChar ) USING STDCALL FROM USER32.DLL
DLLFUNCTION keybd_event( bVk, bScan, dwFlags, dwExtraInfo ) USING STDCALL FROM USER32.DLL
*-----------------------------------------------------
procedure appsys
return
*-----------------------------------------------------
procedure main
//...
MsgBox( "Start Thread" )
oThread := Thread():new()
oThread:start( "FindHandle", "ABCD" )
//...
oDlg := XbpDialog():new( , , {0,0}, AppDesktop():currentSize() )
oDlg:title := "Programmfenster"
oDlg:taskList := .T.
oDlg:create()
SetAppFocus( oDlg )
nEvent := 0
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
oDlg:destroy()
return
*-----------------------------------------------------
function FindHandle( par1 )
local nHandle := 0
local nStart := seconds()
do while ( nHandle = 0 ) .and. ( seconds() < ( nStart + 20 ) )
nHandle := wGetWinHandleFromTitle( "Unbenannt - Edi" )
iif( nHandle = 0, Sleep( 100 ), )
// tone( 100, 3 ) // Test-Ausgabe
enddo
if nHandle > 0
SchreibText( nHandle, "Die einfache Ausgabe funktioniert bei mir !!!" + chr( 13 ) )
sleep( 25 )
msgbox( "Gefunden !!!", "Fenster" )
else
msgbox( "Nicht gefunden !!!", "Fenster" )
endif
return nil
*-----------------------------------------------------
function SchreibText( nHandle, cText )
local i
local cChar
local iChar
ShowWindow( nHandle, SW_NORMAL )
*BringWindowToTop( nHandle )
SetForegroundWindow( nHandle )
for i = 1 to len( cText )
cChar := substr( cText, i, 1 )
iChar := VkKeyScanA( asc( cChar ) )
iif( isbit( iChar, 9 ), keybd_event( VK_SHIFT, 0, 0, 0 ), nil )
keybd_event( numand( iChar, 0xFF ), 0, 0, 0 )
sleep( 5 )
keybd_event( numand( iChar, 0xFF ), 0, KEYEVENTF_KEYUP, 0 )
iif( isbit( iChar, 9 ), keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ), nil )
next
return nil
*-----------------------------------------------------
function wGetWinHandleFromTitle( cTitle )
local nCallBack, nFlags
nGetWinHandleFromTitle := 0
cGetWinHandleFromTitle := cTitle
nCallBack := BaCallBack( "wGetWinHandleFromTitleCallBack", BA_CB_GENERIC1 )
nFlags := 0
EnumWindows( nCallback, nFlags )
return( nGetWinHandleFromTitle )
*-----------------------------------------------------
// Call-Back-Funktion
FUNCTION wGetWinHandleFromTitleCallBack( hWnd, nPar1 )
local cWindowName := space( 71 )
GetWindowTextA( hWnd, @cWindowName, 70 )
* cWindowName := strtran( cWindowName, chr( 0 ) )
cWindowName := ZTrim( cWindowName )
if left( cWindowName, len( cGetWinHandleFromTitle ) ) == cGetWinHandleFromTitle
nGetWinHandleFromTitle := hWnd
RETURN 0
endif
RETURN 1
*-----------------------------------------------------
Static FUNCTION ZTrim( cString )
LOCAL nZPos
nZPos := At( Chr( 0 ), cString )
RETURN IIF( nZPos>0, Substr( cString, 1, nZPos-1 ), cString )
*-----------------------------------------------------
Bei mir funktioniert es auf verschiedenen Rechnern, egal wie groß das Programmfenster ist, ob der Editor schon läuft oder nicht (Hauptssache er wird innerhalb von 20 Sekunden nach Threadstart gestartet).
Gruß
Boddy
PS.: Du benutzt doch Windows ???