Code:
' Screen scrape a DOS application in 99 lines (could be less!). ' Fills in a listbox with all top level apps. ' select one and press the button to attempt to attach a console and see the screen ' Chris Holbrook 4 Jul 2008. With thanks to Eros Olmi #COMPILE EXE #DIM ALL #INCLUDE "WIN32API.INC" %IDD_DIALOG1 = 101 %IDC_LISTBOX1 = 1001 %IDC_BUTTON1 = 1002 DECLARE FUNCTION AttachConsole LIB "kernel32.dll" ALIAS "AttachConsole" (dwProcessId AS DWORD) AS LONG DECLARE FUNCTION GetConsoleWindow LIB "kernel32.dll" ALIAS "GetConsoleWindow" AS LONG TYPE WinInfoType WinTitle AS STRING * 256 WinHandle AS LONG END TYPE GLOBAL gWinList() AS WinInfoType GLOBAL gWinListPos AS LONG '------------------------------------------------------------------------------ FUNCTION GetWindowsByTitle(hD AS DWORD, lCtl AS LONG) AS LONG LOCAL Count AS LONG LOCAL hW AS DWORD LOCAL dwpid AS DWORD PTR gWinListPos = 0 EnumWindows CODEPTR(EnumWindowsProc), 0 FOR Count = 1 TO gWinListPos hW = gWinList(Count).WinHandle IF IsWindowVisible( hW ) THEN LISTBOX ADD hd, lctl, LTRIM$(STR$(hW,8)) + " : " + gWinList(Count).WinTitle NEXT Count END FUNCTION '-------------------------------------------------------------------------------- FUNCTION EnumWindowsProc(BYVAL lHandle AS LONG, BYVAL lNotUsed AS LONG) AS LONG DIM wTitle AS STRING DIM lPos AS LONG wTitle = STRING$(256,0) GetWindowText lHandle, BYVAL STRPTR(wTitle), 256 wTitle = EXTRACT$(wTitle, CHR$(0)) IF LEN(wTitle) THEN INCR gWinListPos REDIM PRESERVE gWinList(gWinListPos) gWinList(gWinListPos).WinTitle = wTitle gWinList(gWinListPos).WinHandle = lHandle END IF FUNCTION = 1 END FUNCTION '------------------------------------------------------------------- CALLBACK FUNCTION ShowDIALOG1Proc() LOCAL s AS STRING STATIC dwpid AS DWORD PTR STATIC hWnd, hConsole AS DWORD STATIC szbuffer AS ASCIZ * 65536 LOCAL lcount AS LONG SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG GetWindowsByTitle ( CBHNDL, %IDC_LISTBOX1) CASE %WM_COMMAND SELECT CASE AS LONG CBCTL CASE %IDC_BUTTON1 IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN LISTBOX GET TEXT CBHNDL, %IDC_LISTBOX1 TO s hWNd = VAL(TRIM$(PARSE$(s," ",1))) getWindowThreadProcessID(hWnd,BYVAL VARPTR(dwPid)) IF AttachConsole(@dwpid) = 0 THEN ? "failed to attach console",%MB_TASKMODAL,"error" EXIT SELECT END IF hConsole = GetStdHandle(%STD_OUTPUT_HANDLE) GetConsoleWindow IF 0 = readConsoleOutputCharacter(hConsole, BYVAL VARPTR (szbuffer), 2000, BYVAL 0, lcount) THEN ? "failed to read console",%MB_TASKMODAL,"error" EXIT SELECT END IF ? STR$(lcount) + szbuffer FreeConsole () END IF END SELECT END SELECT END FUNCTION '---------------------------------------------------------------- FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG LOCAL hDlg AS DWORD DIALOG NEW hParent, "Screen Scrape DOS APP", 141, 121, 197, 185, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU _ OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_SYSMODAL OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, _ %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 15, 10, 170, 85 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "Button1", 155, 105, 30, 15 DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt FUNCTION = lRslt END FUNCTION '================================================================ FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION
Comment