2015-02-27 3 views
1

Я пытаюсь отправить автоматические нажатия клавиш в приложение, которое не поддерживает копирование + вставка через небольшую форму VB. Форма загружает данные из текстового файла и использует SendKeys, чтобы запустить его, как только я нажму кнопку.VB: проблема с фокусом ShowWindow

Все работает, за исключением части ShowWindow. В настоящее время я тестирую Notepad, и, за одним исключением, я не могу заставить ShowWindow сосредоточиться на Notepad. Очевидно, я волнуюсь, что он будет делать то же самое с приложением, в котором я в конечном итоге буду работать против этого (в настоящее время у меня нет доступа к нему). Единственным параметром ShowWindow, который делает Notepad active, является SW_SHOWMAXIMIZED. SW_SHOW и SW_SHOWNORMAL ничего не делают, в то время как SW_RESTORE восстанавливает Блокнот, если сведен к минимуму, но моя форма VB остается активным окном.

Я не программист, но я ошибся, сказав своему боссу, что я учился в Паскале Турбо в старшей школе (более десяти лет назад), поэтому я застрял в попытке сделать эту работу. Мой нынешний код вымощен вместе с С.О. и другие источники:

(Я бегу Windows 7 и с помощью MVSE2013)

Imports System.Runtime.InteropServices 
Public Class Form1 
Private Declare Function FindWindow _ 
     Lib "user32" _ 
     Alias "FindWindowA" _ 
     (ByVal lpClassName As String, _ 
     ByVal lpWindowName As String) As IntPtr 

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean 
End Function 

Enum ShowWindowCommands As Integer 
    SW_SHOWNORMAL = 1 
    SW_SHOWMAXIMIZED = 3 
    SW_RESTORE = 9 
End Enum 

Private Sub Form1_Load 
    [form] 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles Button1.Click 

    Dim lHwnd As IntPtr = FindWindow("Notepad", vbNullString) 

    If lHwnd <> IntPtr.Zero Then 
     ShowWindow(lHwnd, ShowWindowCommands.SW_SHOWNORMAL) 
     SendKeys.Send(TextBox1.Text) 
    Else 
     [blah blah error handling] 
    End If 

End Sub 

Я хотел бы попробовать другой способ, как SetForegroundWindow, но я прочитал это не играет хорошо с Windows 7.

ответ

0

Нашел то, что я надеюсь, будет проворным обходным путем от PInvoke. Я в конечном итоге замена этого блока:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ 
Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow _ 
As ShowWindowCommands) As Boolean 
End Function 

Для этого:

Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As IntPtr) As Boolean 

А потом эту строку:

ShowWindow(lHwnd, ShowWindowCommands.SW_SHOWNORMAL) 

Для этого:

BringWindowToTop(lHwnd) 

я понимаю, есть функциональные различия между двумя, но изменение работает в моем конкретном случае, поэтому я счастлив.

Смежные вопросы