Solved

Onscreen keyboard focus issues

Posted on 2004-10-05
8
452 Views
Last Modified: 2007-12-19
Hi

I have created an onscreen keyboard and

topmost = true
and i use the sendkeys.send(data) to send

but my program keeps setting focus back on the keyboard when pressed

how do I stop that from happening

Thanks
Adam
0
Comment
Question by:adam_pedley
  • 4
  • 3
8 Comments
 
LVL 18

Accepted Solution

by:
armoghan earned 500 total points
ID: 12225212
get the process ID of the other window and set it active
0
 
LVL 18

Expert Comment

by:armoghan
ID: 12225225
following links may help in getting the handle of the window and making focus on it
http://www.codeproject.com/csharp/windowhider.asp
http://www.error-bank.com/microsoft.public.dotnet.framework/71290_Thread.aspx
0
 
LVL 18

Expert Comment

by:armoghan
ID: 12225236
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
LVL 27

Expert Comment

by:planocz
ID: 12226716
Try this sample to catch key strokes before it gets to your keypress events....


  Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
        Const WM_KEYDOWN As Integer = &H100
        Const WM_SYSKEYDOWN As Integer = &H104
        Dim e As System.EventArgs

        If ((msg.Msg = WM_KEYDOWN) Or (msg.Msg = WM_SYSKEYDOWN)) Then
            Select Case (keyData)
                'The Number Key Pads, 10 key and regular 0-9 keys
            Case Keys.A
                    'DO SomeThing
                Case Keys.NumPad1, Keys.D1
                                   'DO SomeThing
                Case Keys.NumPad2, Keys.D2
                                   'DO SomeThing
                Case Keys.B
                                  'DO SomeThing
            End Select
        End If
        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function
0
 
LVL 4

Author Comment

by:adam_pedley
ID: 12233183
Public Class Keypad
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Private Declare Function GetForegroundWindow Lib "user32" () As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private first_time As Boolean = False
    Private This_App As Long
    Private last_app As Long

    'Enables light when caps lock button is pressed
    Private Sub Caps_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Caps.Click
        If lblCaps.BackColor.Equals(Color.Silver) Then
            lblCaps.BackColor = Color.LightGreen
        Else
            lblCaps.BackColor = Color.Silver
        End If
    End Sub

    Private Sub Keypad_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Start()
    End Sub

    'Detects a button is clicked and gives the value of the button pressed to the key press function (Only keys A-Z 0-9)
    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles A.Click, B.Click, C.Click, D.Click, E.Click, F.Click, G.Click, H.Click, I.Click, J.Click, K.Click, L.Click, M.Click, N.Click, O.Click, P.Click, Q.Click, R.Click, S.Click, T.Click, U.Click, V.Click, W.Click, X.Click, Y.Click, Z.Click, _0.Click, _1.Click, _2.Click, _3.Click, _4.Click, _5.Click, _6.Click, _7.Click, _8.Click, _9.Click, _Dot.Click
        Key_Press(sender.text)
    End Sub

    'Displays the key pressed on the screen
    Private Sub Key_Press(ByVal value As String)
        'Detects if caps lock is on, if so it converts the character to uppercase or lowercase
        If lblCaps.BackColor.Equals(Color.LightGreen) Then
            value = value.ToUpper()
        Else
            value = value.ToLower()
        End If
        'Displays the keypressed on the screen
        'txtText.Text = txtText.Text & value
        set_focus()
        SendKeys.Send(value)
    End Sub


    'Removes a character from the screen
    Private Sub BackSpace__Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BackSpace_.Click
        set_focus()
        SendKeys.Send(Chr(8))
    End Sub

    'Adds a space to the screen
    Private Sub Space_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Space.Click
        set_focus()
        SendKeys.Send(" ")
    End Sub

    'Creates a new line to the screen
    Private Sub Enter__Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Enter_.Click
        set_focus()
        SendKeys.Send(Chr(13))
    End Sub

    Public Sub set_focus()
        SetForegroundWindow(last_app)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If first_time = False Then
            first_time = True
            This_App = GetForegroundWindow
        End If
        If This_App <> GetForegroundWindow Then
            last_app = GetForegroundWindow
        End If
    End Sub
End Class

Ok that is my code, I managed to work out the getforegroundwindow function, but my problem now, is that it requires a timer to keep detecting the current window and will switch focus back to the other one if the keypad is pressed. I have seen an example in Delphi (not .NET) that you can open a window with no_activate. This would be my preferred preference. I wouldnt have to have the timer and stupid holes in my code.

Does anyone know how to do this?
0
 
LVL 4

Author Comment

by:adam_pedley
ID: 12233687
I have found out some additional information on the no_activate which i will share here, hopefully someone will be able to figure the rest out

This URL has a few people explaining it slightly but no examples or anything
http://www.eggheadcafe.com/ng/microsoft.public.vb.winapi.graphics/post558542.asp

This URL shows a code example of calling a form and setting the no activate function
http://vbnet.mvps.org/index.html?code/forms/setlayeredwindowattributes.htm

Here is the MSDN link for it
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemfc/htm/cwnd_192.asp

hope this helps in someway
0
 
LVL 4

Author Comment

by:adam_pedley
ID: 12234164
this question is obviously stumping people, i have never had a question open so long

I am upping the points to 1000 (i will open another 500 point question for the user to get the rest of the points once this is answered)
0
 
LVL 4

Author Comment

by:adam_pedley
ID: 12244916
Ok im going to repost the question with the new twist to it
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

1.0 - Introduction Converting Visual Basic 6.0 (VB6) to Visual Basic 2008+ (VB.NET). If ever there was a subject full of murkiness and bad decisions, it is this one!   The first problem seems to be that people considering this task of converting…
It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question