.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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д