Basic'de Sendkey kodu nasıl çalıştırılır?

burak aksu

Hectopat
Katılım
10 Ağustos 2014
Mesajlar
115
Daha fazla  
Cinsiyet
Erkek
Tam olarak sorum şu örneğin numpad 0'a basınca ekrana mesaj gelsin ama bu sadece programın sekmesi açıkken çalışıyor. Yani başka bir programın sekmesine geçince veya yaptığımız programı simge durumuna geçirince numpad 0'a basınca program işe yaramıyor. Bu olayı nasıl çözebiliriz?
 
İstediğiniz şey mümkün değil. Aktif olmayan programınızdan sadece aktif pencereye mesaj gönderebilirsiniz. Ondan sonrası sizin yazdığınız programdan çıkmış oluyor.
Zaten istediğiniz şey mümkün olsaydı farklı programlar aynı klavye komutunu kullanmak isteseydi hangisi çalışacaktı. Kaos durumu ortaya çıkacaktı.
Konuyla ilgili buradaki yazıları inceleyin.
c# - WPF: How to interact with inactive window? - Stack Overflow
winapi - How do I send key strokes to a window without having to activate it using Windows API? - Stack Overflow

Yapmanız gereken şey programın hiç bir şekilde inaktif konuma gelmemesi. Pencerenin kapatma, indirme tuşlarını ortadan kaldırabilirsiniz ama kullanıcı başka pencere seçtiği anda klavye komutları gene çalışmaz.
Pencereyi tam ekran yaparsanız bu sefer kullanıcı fare ile programdan çıkamaz. Ama "Alt-Tab" gibi komutlar ile pencereden çıkması gene mümkün.
 
İstediğiniz şey mümkün değil. Aktif olmayan programınızdan sadece aktif pencereye mesaj gönderebilirsiniz. Ondan sonrası sizin yazdığınız programdan çıkmış oluyor.
Zaten istediğiniz şey mümkün olsaydı farklı programlar aynı klavye komutunu kullanmak isteseydi hangisi çalışacaktı. Kaos durumu ortaya çıkacaktı.
Konuyla ilgili buradaki yazıları inceleyin.
c# - WPF: How to interact with inactive window? - Stack Overflow
winapi - How do I send key strokes to a window without having to activate it using Windows API? - Stack Overflow

Yapmanız gereken şey programın hiç bir şekilde inaktif konuma gelmemesi. Pencerenin kapatma, indirme tuşlarını ortadan kaldırabilirsiniz ama kullanıcı başka pencere seçtiği anda klavye komutları gene çalışmaz.
Pencereyi tam ekran yaparsanız bu sefer kullanıcı fare ile programdan çıkamaz. Ama "Alt-Tab" gibi komutlar ile pencereden çıkması gene mümkün.
Ben tam olarak anlatamadım. Daha önce buna benzer bir program görmüştüm. Hatta bir tane değil bir sürü gördüm. Örneğin speed click adında bir program, program simge durumunda olsa dahi belirlediğim tuşa basınca click devreye giriyordu. Bende buna benzer bir şey yapmak istiyorum.
 
İstediğiniz şeyi buldum. "Hotkey" atayarak yapabilirsiniz. Mesela DeepFreeze programı "Ctrl+Shift+Alt+F6" ile aktif hale geliyor. Sadece "F6" tuşu ile veya sizin istediğiniz "0" tuşu ile çalıştırmanız mümkün değil.
Kod:
Imports System.Runtime.InteropServices

Public Class Form1

    Public Const MOD_ALT As Integer = &H1 'Alt key
    Public Const WM_HOTKEY As Integer = &H312

    <DllImport("User32.dll")> _
    Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
    End Function

    <DllImport("User32.dll")> _
    Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RegisterHotKey(Me.Handle, 100, MOD_ALT, Keys.D)
        RegisterHotKey(Me.Handle, 200, MOD_ALT, Keys.C)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_HOTKEY Then
            Dim id As IntPtr = m.WParam
            Select Case (id.ToString)
                Case "100"
                    MessageBox.Show("You pressed ALT+D key combination")
                Case "200"
                    MessageBox.Show("You pressed ALT+C key combination")
            End Select
        End If
        MyBase.WndProc(m)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        UnregisterHotKey(Me.Handle, 100)
        UnregisterHotKey(Me.Handle, 200)
    End Sub

End Class
 
İstediğiniz şeyi buldum. "Hotkey" atayarak yapabilirsiniz. Mesela DeepFreeze programı "Ctrl+Shift+Alt+F6" ile aktif hale geliyor. Sadece "F6" tuşu ile veya sizin istediğiniz "0" tuşu ile çalıştırmanız mümkün değil.
Kod:
Imports System.Runtime.InteropServices

Public Class Form1

    Public Const MOD_ALT As Integer = &H1 'Alt key
    Public Const WM_HOTKEY As Integer = &H312

    <DllImport("User32.dll")> _
    Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
    End Function

    <DllImport("User32.dll")> _
    Public Shared Function UnregisterHotKey(ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RegisterHotKey(Me.Handle, 100, MOD_ALT, Keys.D)
        RegisterHotKey(Me.Handle, 200, MOD_ALT, Keys.C)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_HOTKEY Then
            Dim id As IntPtr = m.WParam
            Select Case (id.ToString)
                Case "100"
                    MessageBox.Show("You pressed ALT+D key combination")
                Case "200"
                    MessageBox.Show("You pressed ALT+C key combination")
            End Select
        End If
        MyBase.WndProc(m)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        UnregisterHotKey(Me.Handle, 100)
        UnregisterHotKey(Me.Handle, 200)
    End Sub

End Class
İşte aradığım buydu çok saolun. Çok teşekkür ederim. :)
 
Uyarı! Bu konu 11 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı