国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Winform虛擬/模擬鍵盤

這篇具有很好參考價(jià)值的文章主要介紹了Winform虛擬/模擬鍵盤。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

項(xiàng)目需要在觸摸屏上增加一個(gè)虛擬鍵盤。記錄下過程中遇到的問題及解決方法。

1.模擬按鍵

網(wǎng)上找到如下3種方法

1)SendKeys.Send

測(cè)試單獨(dú)的shift不好用,所以最終未采納此方法

SendKeys.Send("^{E}");//shift+e
SendKeys.Send("{Enter}");

2)keybd_event

最終選擇了這個(gè)方法,簡(jiǎn)單有效。

虛擬按鍵對(duì)照表:https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
public static uint KEYEVENTF_KEYDOWN = 0;// 鍵按下 KEYEVENTF_KEYDOWN = 0
public static uint KEYEVENTF_KEYUP = 2;//鍵彈起 KEYEVENTF_KEYUP = 2
keybd_event(0x14, 0, KEYEVENTF_KEYDOWN, 0); //鍵按下 KEYEVENTF_KEYDOWN = 0
keybd_event(0x14, 0, KEYEVENTF_KEYUP, 0); //鍵彈起 KEYEVENTF_KEYUP = 2

3)PostMessage

這個(gè)方法也是簡(jiǎn)單有效,但是據(jù)說(shuō)有些其他問題,沒有仔細(xì)研究,有興趣的可以自己研究。

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
public static extern int PostMessage(IntPtr hWnd, int Msg, Keys wParam, int lParam);

PostMessage(textBox2.Handle, 256, Keys.D, 2);//模擬按下2次 Keys.D

2.各種類型鍵的處理

微軟對(duì)鍵盤輸入有進(jìn)行了分類,可以參考這個(gè)。

https://learn.microsoft.com/zh-cn/windows/win32/learnwin32/keyboard-input

1)CapsLock鍵/NumLock鍵

想要實(shí)現(xiàn)鍵盤按下抬起與界面效果相同,就需要捕獲鍵盤操作。我使用了Hook

以下這篇博客寫的很清晰明了,就不贅述了。

https://www.cnblogs.com/chorm590/p/14199978.html

在hook回調(diào)函數(shù)中做了如下處理

private int keyboardHookCallback(int code, IntPtr wParam, IntPtr lParam)
{
  if (code < 0)
    {
       return User32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
    }
   else
   {
     Keyboard_LL_Hook_Data khd = (Keyboard_LL_Hook_Data)Marshal.PtrToStructure(lParam, typeof(Keyboard_LL_Hook_Data));
      System.Diagnostics.Debug.WriteLine($"key event:{wParam}, key code:{khd.vkCode}, event time:{khd.time}");
      if ((int)wParam == 256 && khd.vkCode == 0x14)
      {
        IsCapsLockDown = !IsCapsLockDown;
      }
      return User32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
   }
}
private bool isCapsLockDown;
private bool IsCapsLockDown
{
  get { return isCapsLockDown; }
   set
    {
      isCapsLockDown = value;
       this.buttonCapsLock.BackColor = value ? Color.Gray : Control.DefaultBackColor;
    }
}
private void buttonCapsLock_Click(object sender, EventArgs e)
{
  User32.keybd_event(VirtualKeyCode.CAPS_LOCK, 0, 0, 0);   //鍵按下 KEYEVENTF_KEYDOWN = 0
   User32.keybd_event(VirtualKeyCode.CAPS_LOCK, 0, 2, 0);  //鍵彈起 KEYEVENTF_KEYUP = 2
}

初始化時(shí)同步鍵盤CapsLock/NumLock狀態(tài),使用user32.GetKeyState.返回值等于1則按下狀態(tài)

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern short GetKeyState(int keyCode);
public static bool GetState(byte VKeyCode)
{
   return (User32.GetKeyState(VKeyCode) == 1);
}

2)其他組合鍵處理

ctrl+shift切換輸入法,只響應(yīng)這一種功能鍵+功能鍵。其他小伙伴有好的方法可以分享一下。

3)輸入鍵+組合鍵

如ctrl+c,ctrl+v,ctrl+a,ctrl+z等等。

此方法不是最優(yōu)方式,可以改進(jìn)功能鍵存放在Queue中,遍歷功能鍵,按順序響應(yīng)。

private void HandleKeysCombin(byte VKCode)
{
  //設(shè)置焦點(diǎn)控件
   this.ActiveControl = this.m_CustomActiveControl;
   lock (this)
   {
     if (IsCtrlDown)
      {
        keybd_event(VirtualKeyCode.CTRL, 0, KEYEVENTF_KEYDOWN, 0);                //鍵按下 KEYEVENTF_KEYDOWN = 0
      }
      if (IsShiftDown)
      {
        keybd_event(VirtualKeyCode.SHIFT, 0, KEYEVENTF_KEYDOWN, 0);                //鍵按下 KEYEVENTF_KEYDOWN = 0
      }
      if (IsAltDown)
      {
        keybd_event(VirtualKeyCode.ALT, 0, KEYEVENTF_KEYDOWN, 0);                //鍵按下 KEYEVENTF_KEYDOWN = 0
      }
      keybd_event(VKCode, VKCode, User32.KEYEVENTF_KEYDOWN, 0);                //鍵按下 KEYEVENTF_KEYDOWN = 0
      keybd_event(VKCode, VKCode, User32.KEYEVENTF_KEYUP, 0);           //鍵彈起 KEYEVENTF_KEYUP = 2
      if (IsCtrlDown)
      {
        keybd_event(VirtualKeyCode.CTRL, 0, KEYEVENTF_KEYUP, 0);                //鍵彈起 KEYEVENTF_KEYUP = 2
         IsCtrlDown = false;
      }
      if (IsShiftDown)
      {
        keybd_event(VirtualKeyCode.SHIFT, 0, KEYEVENTF_KEYUP, 0);              //鍵彈起 KEYEVENTF_KEYUP = 2
         IsShiftDown = false;
      }
      if (IsAltDown)
      {
         keybd_event(VirtualKeyCode.ALT, 0, KEYEVENTF_KEYUP, 0);                //鍵彈起 KEYEVENTF_KEYUP = 2
        IsAltDown = false;
     }
  }
}

3.窗體/UserControl焦點(diǎn)的處理

這篇里面方法簡(jiǎn)單好用,不贅述

?https://blog.csdn.net/accomp/article/details/7209052文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-456196.html

到了這里,關(guān)于Winform虛擬/模擬鍵盤的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32F103C8T6+2.4寸SPI TFT觸摸屏代碼+標(biāo)準(zhǔn)庫(kù) 項(xiàng)目開發(fā)

    STM32F103C8T6+2.4寸SPI TFT觸摸屏代碼+標(biāo)準(zhǔn)庫(kù) 項(xiàng)目開發(fā)

    目錄 模塊清單: 模塊介紹: 1:STM32F103C8T6 2:2.4寸SPI TFT觸摸屏 項(xiàng)目結(jié)果展示 2.4寸 TFT SPI顯示觸摸屏 2.4寸 SPI TFT 顯示觸摸屏代碼下載鏈接: https://download.csdn.net/download/weixin_49492286/88458377 清單 STM32F103C8T6 2.4寸SPI TFT觸摸屏 ????????STM32F103C8T6是意法半導(dǎo)體(STMicroelectronics)推

    2024年02月07日
    瀏覽(88)
  • 應(yīng)用在手機(jī)觸摸屏中的電容式觸摸芯片

    應(yīng)用在手機(jī)觸摸屏中的電容式觸摸芯片

    觸控屏(Touch panel)又稱為觸控面板,是個(gè)可接收觸頭等輸入訊號(hào)的感應(yīng)式液晶顯示裝置,當(dāng)接觸了屏幕上的圖形按鈕時(shí),屏幕上的觸覺反饋系統(tǒng)可根據(jù)預(yù)先編程的程式驅(qū)動(dòng)各種連結(jié)裝置,可用以取代機(jī)械式的按鈕面板,并借由液晶顯示畫面制造出生動(dòng)的影音效果。 手機(jī)觸摸

    2024年02月07日
    瀏覽(26)
  • 應(yīng)用在游戲機(jī)觸摸屏中的觸摸感應(yīng)芯片

    應(yīng)用在游戲機(jī)觸摸屏中的觸摸感應(yīng)芯片

    觸屏游戲機(jī)的屏幕是由液晶屏和觸控層組成的。觸控層分為電容式觸屏和電阻式觸屏兩種。電容式觸屏是將懸空電極和屏幕玻璃上的電極組成靜電場(chǎng),當(dāng)人體接近屏幕時(shí),就會(huì)改變靜電場(chǎng)分布,從而實(shí)現(xiàn)觸摸的位置探測(cè)。而電阻式觸屏則是利用玻璃上的兩層電極之間通電形成一個(gè)

    2024年01月18日
    瀏覽(31)
  • LABVIEW 虛擬鍵盤 觸摸鍵盤 中英文輸入 支持WIN10 WIN7

    LABVIEW 虛擬鍵盤 觸摸鍵盤 中英文輸入 支持WIN10 WIN7

    ? ?當(dāng)labview打包后在工業(yè)觸摸電腦上運(yùn)行,一旦需要修改參數(shù),便有一個(gè)頭疼的問題: ? ? 1、要么接鍵盤鼠標(biāo),那么便失去了觸屏的優(yōu)勢(shì),設(shè)備或儀器結(jié)構(gòu)也不夠簡(jiǎn)潔美觀; ? ? 2、要么使用系統(tǒng)自帶虛擬鍵盤,鍵盤有時(shí)會(huì)蓋住需要輸入的地方,盲輸鍵碼,那個(gè)使用體驗(yàn)就不

    2024年02月10日
    瀏覽(34)
  • ESP32開發(fā)---驅(qū)動(dòng)觸摸屏

    ESP32開發(fā)---驅(qū)動(dòng)觸摸屏

    采用 I2C 驅(qū)動(dòng)觸摸屏。 I2C 多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場(chǎng)合使用,傳輸距離短,任意時(shí)刻只能有一個(gè)主機(jī)等特性。 它有兩條線,一條是 SCL (串行時(shí)鐘總線),另外一條是SDA(串行數(shù)據(jù)線),這兩條數(shù)據(jù)需要接上拉電阻,總線空閑的時(shí)候SCL和SDA處于高電

    2024年02月08日
    瀏覽(24)
  • 基于GEC6818的觸摸屏

    基于GEC6818的觸摸屏

    連接操作系統(tǒng)的輸入設(shè)備,可不止一種,也許是一個(gè)標(biāo)準(zhǔn)PS/2鍵盤,也許是一個(gè)USB鼠標(biāo),或者是一塊觸摸屏,甚至是一個(gè)游戲機(jī)搖桿,Linux在處理這些紛繁各異的輸入設(shè)備的時(shí)候,采用的辦法還是找中間層來(lái)屏蔽各種細(xì)節(jié),請(qǐng)看下圖: 在Linux的內(nèi)核中,對(duì)輸入設(shè)備的使用,實(shí)際

    2024年02月05日
    瀏覽(22)
  • Linux 多點(diǎn)電容觸摸屏實(shí)驗(yàn)

    Linux 多點(diǎn)電容觸摸屏實(shí)驗(yàn)

    1、多點(diǎn)觸摸(MT)協(xié)議詳解 電容觸摸屏驅(qū)動(dòng)其實(shí)就是以下幾種 linux 驅(qū)動(dòng)框架的組合: ①、IIC 設(shè)備驅(qū)動(dòng),因?yàn)殡娙萦|摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 設(shè)備驅(qū)動(dòng)。 ②、通過中斷引腳(INT)向 linux 內(nèi)核上報(bào)觸摸信息,因此需要用到 linux 中斷驅(qū)動(dòng)框架。坐標(biāo)的上報(bào)在中斷

    2024年02月06日
    瀏覽(24)
  • Linux 觸摸屏 (IIC驅(qū)動(dòng)詳解)

    Linux 觸摸屏 (IIC驅(qū)動(dòng)詳解)

    本文使用觸摸屏iic驅(qū)動(dòng),驅(qū)動(dòng)編寫中要使用 總線,設(shè)備,驅(qū)動(dòng) 分層的思想,IIC總線,觸摸屏驅(qū)動(dòng),觸摸屏設(shè)備, ? 一般 SOC 的 I2C 總線驅(qū)動(dòng)都是由半導(dǎo)體廠商編寫的,比如 I.MX6U 的 I2C 適配器驅(qū)動(dòng) NXP 已經(jīng)編寫好了,這個(gè)不需要用戶去編寫。因此 I2C 總線驅(qū)動(dòng)對(duì)我們這些 SOC 使

    2023年04月11日
    瀏覽(29)
  • WPF --- 觸摸屏下的兩個(gè)問題

    WPF --- 觸摸屏下的兩個(gè)問題

    本片文章分享一下之前遇到的WPF應(yīng)用在觸摸屏下使用時(shí)的兩個(gè)問題。 具體場(chǎng)景就是一個(gè)配置界面, ScrollViewer 中包含一個(gè) StackPanel 然后縱向堆疊,已滾動(dòng)的方式查看,然后包含多個(gè) TextBlock 、 TextBox 以及 DataGrid ,期間遇到了兩個(gè)問題: WPF在觸摸屏下,如果有滾動(dòng)條( ScrollVie

    2024年03月09日
    瀏覽(39)
  • 電容觸摸屏驅(qū)動(dòng)(Linux驅(qū)動(dòng)開發(fā)篇)

    電容觸摸屏驅(qū)動(dòng)(Linux驅(qū)動(dòng)開發(fā)篇)

    電容屏只需要手指輕觸即可,而電阻屏是需要手指 給予一定的壓力才有反應(yīng),而且電容屏不需要校準(zhǔn)。 如果要做人機(jī)交互設(shè)備的開發(fā),多點(diǎn)電容觸摸屏基本是不可能繞過去的。 正點(diǎn)原子ATK-7016 這款屏幕 其實(shí)是由 TFT LCD+觸摸屏組合起來(lái)的。底下是 LCD 面板,上面是觸摸面板,

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包