Recent

Author Topic: Delve into Vb6 Time - Sendkeys for Windows  (Read 3757 times)

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Delve into Vb6 Time - Sendkeys for Windows
« on: May 22, 2019, 11:16:35 pm »
Way back in my VB6 days, I made an application called Key Scripts using Windows ShellExec API for sendkeys.
The program worked awesome.

I am beginning to re-make using LAZ.

I need not only the sendkeys part but also the HWND part too
So I can identify applications and their title captions

I know its a windows shell exec api thing, but in Pascal, what coding am I using to call send keys so it works in LAZ??



« Last Edit: May 22, 2019, 11:18:14 pm by pixelink »
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

Edson

  • Hero Member
  • *****
  • Posts: 1301
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #1 on: May 23, 2019, 02:02:35 am »
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #2 on: May 23, 2019, 02:15:55 am »
Have you tested http://wiki.freepascal.org/MouseAndKeyInput ?

No, because it seems to be limited to just key input and mouse clicks... Sendkeys in Windows is far more powerful.
I need to be able to get info on open apps, their title bars etc ect
« Last Edit: May 23, 2019, 12:18:09 pm by pixelink »
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

jamie

  • Hero Member
  • *****
  • Posts: 6090
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #3 on: May 23, 2019, 02:21:27 am »
If you have done such a program in the past you should still have it kicking around?

Its easy to take the source code of an Existing VB app and convert it over so I take it you
have not material at all to start with ?

I'll give you some pointers

You need to use EnumerateWindows and Maybe EnumerateChildWindows.

after that, you'll have a list of windows operating..

To send Key stuff,  you could simulate the keyboard using "keybd_event" or I guess you could use VK_XXXXX messages

Of course, getting the Titles/Captions of the windows is simple, "GETText"

Anyways, did that jog your memory any ?
The only true wisdom is knowing you know nothing

Zvoni

  • Hero Member
  • *****
  • Posts: 2319
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #4 on: May 23, 2019, 12:17:33 pm »
Well, in VB6 the classic (!) way to get a HWND for a Window is the "FindWindow"/"FindWindowEx"-API.....
One System to rule them all, One Code to find them,
One IDE to bring them all, and to the Framework bind them,
in the Land of Redmond, where the Windows lie
---------------------------------------------------------------------
Code is like a joke: If you have to explain it, it's bad

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #5 on: May 23, 2019, 01:13:33 pm »
As I said early... I know about the Win API...

And, yes, I do have that old VB6 app laying around, but you can't just copy and paste it into LAZ and it will work,

How does LAZ actually hook up to the Sendkeys API??

Here is most of my VB6 code...

Code: Pascal  [Select][+][-]
  1.  
  2. Option Explicit
  3.  
  4. Declare Function EnumWindows Lib "user32" (ByVal wndenmprc As Long, ByVal lParam As Long) As Long
  5. Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  6. Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  7. Public Const WM_CLOSE = &H10
  8.  
  9. Private Target As String
  10. ' Check a returned task to see if we should
  11. ' kill it.
  12. Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long
  13. Dim buf As String * 256
  14. Dim Title As String
  15. Dim length As Long
  16.  
  17.     ' Get the window's title.
  18.     length = GetWindowText(app_hWnd, buf, Len(buf))
  19.     Title = Left$(buf, length)
  20.  
  21.     ' See if this is the target window.
  22.    If InStr(Title, Target) <> 0 Then
  23.        ' Kill the window.
  24.         On Error GoTo CantClose
  25.         SendMessage app_hWnd, WM_CLOSE, 0, 0
  26.     End If
  27.    
  28.     ' Continue searching.
  29.    EnumCallback = 1
  30.    
  31.    Exit Function
  32. CantClose:
  33.        MsgBox "For some unknown reason, this program/file can not be closed. You will have to manually close it.", 48, "Close Message"
  34.        EnumCallback = 1
  35. End Function
  36.  
  37. ' Ask Windows for the list of tasks.
  38. Public Sub TerminateTask(app_name As String)
  39.     Target = app_name
  40.     EnumWindows AddressOf EnumCallback, 0
  41. End Sub
  42.  
  43.  

Code: Pascal  [Select][+][-]
  1.  
  2. 'sleep for funct for pausing
  3. Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  4.  
  5. 'Find window title
  6. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  7.  
  8. Public AP As String
  9. Public CWP As String
  10. Public MyStr As String
  11. Public InTxtStr As String
  12. Public CurFile As String
  13. Public MyDate As String
  14. Public MyCancel As Boolean
  15. Public L1 As String
  16. Public L2 As String
  17. Public CFileF As String
  18. Public CFile As String
  19. Public RepOn As String
  20. Public RepNbr As Double
  21. Public RepCnt As Double
  22. Public RepNew As String
  23.  
  24.  
  25. Sub Main()
  26.  
  27. Splash.Show 1
  28. frmMain.Show 'fMainForm
  29.  
  30. End Sub
  31.  
  32.  
  33.  


Code: Pascal  [Select][+][-]
  1.  
  2. Option Explicit
  3.  
  4.       Public Declare Function ShellExecute Lib "shell32.dll" Alias _
  5.       "ShellExecuteA" (ByVal hWnd As Long, ByVal lpszOp As _
  6.       String, ByVal lpszFile As String, ByVal lpszParams As String, _
  7.       ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long
  8.  
  9.       Public Declare Function GetDesktopWindow Lib "user32" () As Long
  10.  
  11. ' hWnd = Window handle to a parent window.
  12. ' This window receives any message boxes that an application produces.
  13. '
  14. ' lpszOp = Address of a null-terminated string that specifies the operation to perform.
  15. ' The following operation strings are valid:
  16. ' open, print, explore
  17. ' This parameter can be NULL. In that case, the function opens the file specified
  18. ' by lpFile.
  19. '
  20. ' lpFile = Address of a null-terminated string that specifies the file to open
  21. ' or print or the folder to open or explore. The function can open an executable
  22. ' file or a document file. The function can print a document file.
  23. '
  24. ' lpParameters = If the lpFile parameter specifies an executable file,
  25. ' lpParameters is an address to a null-terminated string that specifies
  26. ' the parameters to be passed to the application.
  27. ' If lpFile specifies a document file, lpParameters should be NULL.
  28. '
  29. ' lpDirectory = Address of a null-terminated string that specifies
  30. ' the default directory.
  31. '
  32. ' nShowCmd = If lpFile specifies an executable file, nShowCmd specifies
  33. ' how the application is to be shown when it is opened.
  34. ' This parameter can be one of the following values:
  35.  
  36.     Const SW_HIDE = 0                '  Hides the window and activates another window.
  37.    Const SW_MAXIMIZE = 3            '  Maximizes the specified window.
  38.     Const SW_MINIMIZE = 6            '  Minimizes the specified window and activates the next top-level window in the z-order.
  39.    Const SW_RESTORE = 9             '  Activates and displays the window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when restoring a minimized window.
  40.     Const SW_SHOW = 5                '  Activates the window and displays it in its current size and position.
  41.    Const SW_SHOWDEFAULT = 10        '  Sets the show state based on the SW_ flag specified in theSTARTUPINFO structure passed to theCreateProcess function by the program that started the application. An application should callShowWindow with this flag to set the initial show state of its main window.
  42.     Const SW_SHOWMAXIMIZED = 3       '  Activates the window and displays it as a maximized window.
  43.    Const SW_SHOWMINIMIZED = 2       '  Activates the window and displays it as a minimized window.
  44.     Const SW_SHOWMINNOACTIVE = 7     '  Displays the window as a minimized window. The active window remains active.
  45.    Const SW_SHOWNA = 8              '  Displays the window in its current state. The active window remains active.
  46.     Const SW_SHOWNOACTIVATE = 4      '  Displays a window in its most recent size and position. The active window remains active.
  47.    Const SW_SHOWNORMAL = 1          '  Activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
  48.  
  49. ' If lpFile specifies a document file, nShowCmd should be zero.
  50. ' You can use this function to open or explore a shell folder.
  51. ' To open a folder, use either
  52. '
  53. ' ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);
  54. ' or
  55. ' ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);
  56. '
  57. ' To explore a folder, use the following call:
  58. '
  59. ' ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL);
  60. '
  61. ' If lpOperation is NULL, the function opens the file specified by lpFile. If lpOperation is "open" or "explore", the function will attempt to open or explore the folder.
  62. '
  63. ' To obtain information about the application that is launched as a result of calling
  64. '
  65. ' Returns a value greater than 32 if successful, or an error value that is less
  66. ' than or equal to 32 otherwise. The following table lists the error values.
  67. ' The return value is cast as an HINSTANCE for backward compatibility with 16-bit
  68. ' Microsoft® Windows® applications. It is not a true HINSTANCE, however.
  69. ' The only thing that can be done with the returned HINSTANCE is to cast it to an
  70. ' integer and compare it with the value 32 or one of the error codes below.
  71.  
  72.     Const SE_ERR_FNF = 2                 '  File not found
  73.    Const SE_ERR_PNF = 3                 '  Path not found
  74.     Const SE_ERR_ACCESSDENIED = 5        '  Access denied
  75.    Const SE_ERR_OOM = 8                 '  Out of memory
  76.     Const SE_ERR_DLLNOTFOUND = 32        '  DLL not found
  77.    Const SE_ERR_SHARE = 26              '  A sharing violation occurred
  78.     Const SE_ERR_ASSOCINCOMPLETE = 27    '  Incomplete or invalid file association
  79.    Const SE_ERR_DDETIMEOUT = 28         '  DDE Time out
  80.     Const SE_ERR_DDEFAIL = 29            '  DDE transaction failed
  81.    Const SE_ERR_DDEBUSY = 30            '  DDE busy
  82.     Const SE_ERR_NOASSOC = 31            '  No association for file extension
  83.    Const ERROR_BAD_FORMAT = 11&         '  Invalid EXE file or error in EXE image
  84.     Const ERROR_FILE_NOT_FOUND = 2&      '  The specified file was not found.
  85.    Const ERROR_PATH_NOT_FOUND = 3&      '  The specified path was not found.
  86.     Const ERROR_BAD_EXE_FORMAT = 193&    '  The .exe file is invalid (non-Win32® .exe or error in .exe image).
  87.  
  88.  
  89. Public Function ShellExecLaunchFile(ByVal strPathFile As String, ByVal strOpenInPath As String, ByVal strArguments As String) As Long
  90.  
  91.    Dim Scr_hDC As Long
  92.    
  93.    'Get the Desktop handle
  94.     Scr_hDC = GetDesktopWindow()
  95.    
  96.     'Launch File
  97.    ShellExecLaunchFile = ShellExecute(Scr_hDC, "Open", strPathFile, "", strOpenInPath, SW_SHOWNORMAL)
  98.  
  99. End Function
  100.  
  101.  
  102. Public Function ShellExecLaunchErr(ByVal lngErrorNumber As Long, ByVal blnRaiseMsg As Boolean) As String
  103.    
  104.    Dim msg As VbMsgBoxResult
  105.    Dim strErrorMessage As String
  106.    
  107.    If lngErrorNumber < 33 Then
  108.        'There was an error
  109.         Select Case lngErrorNumber
  110.             Case SE_ERR_FNF
  111.                 strErrorMessage = "File not found"
  112.             Case SE_ERR_PNF
  113.                 strErrorMessage = "Path not found"
  114.             Case SE_ERR_ACCESSDENIED
  115.                 strErrorMessage = "Access denied"
  116.             Case SE_ERR_OOM
  117.                 strErrorMessage = "Out of memory"
  118.             Case SE_ERR_DLLNOTFOUND
  119.                 strErrorMessage = "DLL not found"
  120.             Case SE_ERR_SHARE
  121.                 strErrorMessage = "A sharing violation occurred"
  122.             Case SE_ERR_ASSOCINCOMPLETE
  123.                 strErrorMessage = "Incomplete or invalid file association"
  124.             Case SE_ERR_DDETIMEOUT
  125.                 strErrorMessage = "DDE Time out"
  126.             Case SE_ERR_DDEFAIL
  127.                 strErrorMessage = "DDE transaction failed"
  128.             Case SE_ERR_DDEBUSY
  129.                 strErrorMessage = "DDE busy"
  130.             Case SE_ERR_NOASSOC
  131.                 strErrorMessage = "No association for file extension"
  132.             Case ERROR_BAD_FORMAT
  133.                 strErrorMessage = "Invalid EXE file or error in EXE image"
  134.             Case ERROR_FILE_NOT_FOUND
  135.                 strErrorMessage = "The specified file was not found."
  136.             Case ERROR_PATH_NOT_FOUND
  137.                 strErrorMessage = "The specified path was not found."
  138.             Case ERROR_BAD_EXE_FORMAT
  139.                 strErrorMessage = "The .exe file is invalid (non-Win32® .exe or error in .exe image)."
  140.             Case Else
  141.                 strErrorMessage = "Unknown error"
  142.         End Select
  143.        
  144.         'If the blnRaiseMsg = True then raise a MsgBox with error
  145.        If blnRaiseMsg = True Then msg = MsgBox(strErrorMessage, vbCritical, "Error:")
  146.        
  147.        'Return Error string
  148.         ShellExecLaunchErr = blnRaiseMsg
  149.    
  150.     End If
  151.    
  152. End Function
  153.  
  154.  
  155. ' So the way to use all this is:
  156. '
  157. '    Dim lngReturnNumber As Long
  158. '
  159. '    lngReturnNumber = ShellExecLaunchFile(txtPathFile.Text, txtStartPath.Text, txtArguments.Text)
  160. '    If lngReturnNumber < 33 Then
  161. '        Call ShellExecLaunchErr(lngReturnNumber, True)
  162. '        Exit Sub
  163. '    End If
  164. '
  165. '==================================================================================
  166. '
  167. '
  168. 'Use the following runRegEntry Function to Silently Run .reg Files
  169. '
  170. Public Function runRegEntry(strPathFile As String) As Boolean
  171.    On Error GoTo Command1Err
  172.    
  173.    Dim dblTemp As Double
  174.    dblTemp = Shell("regedit.exe /s " & strPathFile, vbHide)
  175.    
  176.    runRegEntry = True
  177.    
  178.    Exit Function
  179.    
  180. Command1Err:
  181.    Dim msg As VbMsgBoxResult
  182.  
  183.    msg = MsgBox("Error # " & CStr(Err.Number) & " " & Err.Description & vbNewLine & "With: " & strPathFile, vbCritical, "Error:")
  184.    Err.Clear    ' Clear the error.
  185.     runRegEntry = False
  186.    
  187. End Function
  188.  
  189.  
  190.  

Code: Pascal  [Select][+][-]
  1.  
  2. // WIN API
  3. function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam): LRESULT; stdcall;
  4. const
  5.   Margin = 5;
  6. var
  7.   Rect: TRect;
  8.   MouseX, MouseY: LongInt;
  9. begin
  10.   if uMsg = WM_NCHITTEST then
  11.   begin
  12.     if Rollup then Exit; {keep form from resizing}
  13.  
  14.     Result := Windows.DefWindowProc(Ahwnd, uMsg, wParam, lParam);
  15.     MouseX := GET_X_LPARAM(lParam);
  16.     MouseY := GET_Y_LPARAM(lParam);
  17.     with Rect do
  18.     begin
  19.       Left := MouseX - Form2.BoundsRect.Left;
  20.       Right := Form2.BoundsRect.Right - MouseX;
  21.       Top := MouseY - Form2.BoundsRect.Top;
  22.       Bottom := Form2.BoundsRect.Bottom - MouseY;
  23.       if (Top < Margin) and (Left < Margin) then
  24.         Result := windows.HTTOPLEFT
  25.       else if (Top < Margin) and (Right < Margin) then
  26.         Result := windows.HTTOPRIGHT
  27.       else if (Bottom < Margin) and (Left < Margin) then
  28.         Result := windows.HTBOTTOMLEFT
  29.       else if (Bottom < Margin) and (Right < Margin) then
  30.         Result := windows.HTBOTTOMRIGHT
  31.       else if (Top < Margin) then
  32.         Result := windows.HTTOP
  33.       else if (Left < Margin) then
  34.         Result := windows.HTLEFT
  35.       else if (Bottom < Margin) then
  36.         Result := windows.HTBOTTOM
  37.       else if (Right < Margin) then
  38.         Result := windows.HTRIGHT;
  39.     end;
  40.     Exit;
  41.   end;
  42.   Result := CallWindowProc(PrevWndProc,Ahwnd, uMsg, WParam, LParam);
  43.  
  44. end;  
  45.  
« Last Edit: May 23, 2019, 03:59:21 pm by pixelink »
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

Zvoni

  • Hero Member
  • *****
  • Posts: 2319
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #6 on: May 23, 2019, 01:56:09 pm »
Maybe you should clarify your goal more.
I got some 20 years VB5/6-Experience under my belt, and nowhere i've ever come across, that a SendKey has anything to do with a ShellExecute.
Jamie's hint with sending a message "VK_XXXXX" is actually a pretty good idea, which would also explain, why you would need the hWnd of the target
One System to rule them all, One Code to find them,
One IDE to bring them all, and to the Framework bind them,
in the Land of Redmond, where the Windows lie
---------------------------------------------------------------------
Code is like a joke: If you have to explain it, it's bad

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #7 on: May 23, 2019, 02:32:58 pm »
Maybe you should clarify your goal more.
I got some 20 years VB5/6-Experience under my belt, and nowhere i've ever come across, that a SendKey has anything to do with a ShellExecute.
Jamie's hint with sending a message "VK_XXXXX" is actually a pretty good idea, which would also explain, why you would need the hWnd of the target

My goal is to convert my VB6 project to LAZ... using all the same API's for Sendkeys, Shell and Find window.

ShellExec is just one piece. ShellExc is not Sendkeys. I know that.

I just want to know how do i call the appropriate Win API in LAz to use Sendkeys.
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

Zvoni

  • Hero Member
  • *****
  • Posts: 2319
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #8 on: May 23, 2019, 03:08:50 pm »
UH? Just include the Windows-Unit.
AFAIK, all "common" API's are declared there, except SendKeys, since that one is a built-in VB6-Function, which Sends a "Keystroke" to the ACTIVE Window
« Last Edit: May 23, 2019, 03:14:31 pm by Zvoni »
One System to rule them all, One Code to find them,
One IDE to bring them all, and to the Framework bind them,
in the Land of Redmond, where the Windows lie
---------------------------------------------------------------------
Code is like a joke: If you have to explain it, it's bad

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #9 on: May 23, 2019, 03:09:45 pm »
One thing you have to know... Sendkeys worked out of the VB6 box.
I didn't have to do anything special to use it.

So, what is LAz'a equivelant to Sendkeys and how do I hook it up to use in LAZ?
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #10 on: May 23, 2019, 03:11:01 pm »
UH? Just include the Windows-Unit.
AFAIK, all "common" API's are declared there

I knew that already... but what code do i use to run a "Sendkeys" command??

Thanks
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

Zvoni

  • Hero Member
  • *****
  • Posts: 2319
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #11 on: May 23, 2019, 03:15:32 pm »
UH? Just include the Windows-Unit.
AFAIK, all "common" API's are declared there

I knew that already... but what code do i use to run a "Sendkeys" command??

Thanks

Your best bet would be Jamie's Suggestion: SendMessage-API (getting the target-hWnd first)

EDIT: Look here: https://forum.lazarus.freepascal.org/index.php/topic,4297.15.html
« Last Edit: May 23, 2019, 03:18:19 pm by Zvoni »
One System to rule them all, One Code to find them,
One IDE to bring them all, and to the Framework bind them,
in the Land of Redmond, where the Windows lie
---------------------------------------------------------------------
Code is like a joke: If you have to explain it, it's bad

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #12 on: May 23, 2019, 03:25:23 pm »
Here is the beginnings of my conversion... this looks pretty much like my VB6 app.

You will see the commands in the lower part of the app.
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

Handoko

  • Hero Member
  • *****
  • Posts: 5130
  • My goal: build my own game engine using Lazarus
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #13 on: May 23, 2019, 03:38:38 pm »
It looks good. It must be your Quick Scripts software.

After you finish it, you should proudly add a link and write some info on Lazarus Appication Gallery:
http://wiki.freepascal.org/Lazarus_Application_Gallery

pixelink

  • Hero Member
  • *****
  • Posts: 1260
Re: Delve into Vb6 Time - Sendkeys for Windows
« Reply #14 on: May 23, 2019, 03:39:05 pm »
UH? Just include the Windows-Unit.
AFAIK, all "common" API's are declared there
I knew that already... but what code do i use to run a "Sendkeys" command??
Thanks
Your best bet would be Jamie's Suggestion: SendMessage-API (getting the target-hWnd first)
EDIT: Look here: https://forum.lazarus.freepascal.org/index.php/topic,4297.15.html
Yeah, I saw that. Thanks
But find window doesn't run Sendkey commands.
That is what I need to convert in LAZ first.
« Last Edit: May 23, 2019, 03:45:51 pm by pixelink »
Can't Type - Forgetful - Had Stroke = Forgive this old man!
LAZ 2.2.0 •  VSSTUDIO(.Net) 2022 • Win10 • 16G RAM • Nvida GForce RTX 2060

 

TinyPortal © 2005-2018