.NET 4.x Имитация нажатия клавиш без изменения фокуса окна - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Всем привет! Помогите, пожалуйста, разобраться с формой. В программировании не селен, а сделать очень нужно. Никак не могу понять как мне сделать форму (с кнопками) при нажатии на кнопки не будет уходить фокус от другого приложения. Создал форму с 2 кнопками, которые имитируют нажатие Up и Down. Убрал все границы, сделал ее по верх всех окон. Но вот как сделать так, что при нажатии на одну из 2 кнопок фокус не "уходил" от предыдущего окна. Как это реализовано в экранной клавиатуре. Пробовал передавать SendKey-сы окну, но окно при этом мерцает когда постоянно меняется фокус. Заранее спасибо за любую помощь. p.s. не знаю на сколько это принципиально но это хочу использовать на тачскрине
Пожалуйста, хоть намекните как это можно реализовать?
На просторах нашел вот такой код на VB6:
Помогите его пожалуйста сконвертировать для vb.net или направить в русло. Все мои танцы с бубнами и прочими шаманскими атрибутами не помогли. Ругается вот на параметры "Me.hwnd" : ShowWindow

Me.hwnd

, SW_SHOWNOACTIVATE что и понятно, но как подправить? Судя по комментариям это как раз позволит окну не забирать фокус у приложения. Заранее благодарю за любую помощь!

Решение задачи: «.NET 4.x Имитация нажатия клавиш без изменения фокуса окна»

textual
Листинг программы
Public Class Form1
    WithEvents Timer1 As Timer
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
    Private Const WS_EX_NOACTIVATE As Long = &H8000000
 
    Private Const GWL_EXSTYLE As Long = -20
    Private Const GWL_STYLE As Long = -16
    Dim iExStyle As Long
 
    'переводит поток, который создал определяемое окно в приоритетный режим и активизирует окно
    Public Declare Function SetForegroundWindow Lib "user32.dll" _
    Alias "SetForegroundWindow" (ByVal hwnd As Integer) As Integer
 
    'возвращает дескриптор окна, с которым пользователь в настоящее время работает
    Public Declare Function GetForegroundWindow Lib "user32.dll" _
        Alias "GetForegroundWindow" () As Integer
 
    Private MiniVKeyb_Handle As IntPtr
    Private FocusWindow_Handle As IntPtr
 
    Public Sub StartPosition_()
        Dim pWidthProc, pHeightProc, HeightScreen, xStartPos, yStartPos As Integer
        pWidthProc = 40
        pHeightProc = 240
        xStartPos = 10
        HeightScreen = Screen.PrimaryScreen.Bounds.Height()
        yStartPos = HeightScreen - pHeightProc - 10
        Me.TopMost = True
    End Sub
 
  
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
 
        MiniVKeyb_Handle = GetForegroundWindow()
 
        Timer1 = New Timer With {.Interval = 100}
        Timer1.Start()
        StartPosition_()
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim h1 As IntPtr = GetForegroundWindow()
        If h1 <> MiniVKeyb_Handle Then FocusWindow_Handle = h1
    End Sub
 
 
    Private Sub KeyClick(ByVal Sender As Button, ByVal e As System.EventArgs)
        If FocusWindow_Handle <> 0 Then KeySend(Sender.Text)
    End Sub
    Private Sub KeySend(ByRef Key As String)
        SetForegroundWindow(FocusWindow_Handle)
        SendKeys.Send("{" & Key & "}")
    End Sub
 
  
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If FocusWindow_Handle <> 0 Then KeySend(sender.text)
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If FocusWindow_Handle <> 0 Then KeySend(sender.text)
    End Sub
 
 
    Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
        iExStyle = GetWindowLong(Me.Handle, GWL_EXSTYLE)
        Call SetWindowLong(Me.Handle, GWL_EXSTYLE, iExStyle Or WS_EX_NOACTIVATE)
    End Sub
 
End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы