日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在VC中实现模拟键盘,输入内容并显示在ListBox中。

發(fā)布時間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在VC中实现模拟键盘,输入内容并显示在ListBox中。 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
網(wǎng)上找的,還沒試過,希望對樓主有幫助
模擬鍵盤按鍵 自動輸入文字

鍵盤對于每個操作電腦的人員來說是最熟悉不過的了。鍵盤上的按鍵可分為兩類: 按下后會在電腦的輸入窗口上出現(xiàn)對應(yīng)字符的按鍵,如字母鍵和數(shù)字鍵等,我們稱之為字符鍵;按下后雖然看不到字符但會產(chǎn)生控制作用的按鍵,如回車鍵、光標鍵等,我們稱之為控制鍵。
對于程序員來說,鍵盤上的每個按鍵都一樣,無非是不同按鍵產(chǎn)生的鍵盤掃描碼不同。在不同的操作系統(tǒng)下,鍵盤掃描碼常常被轉(zhuǎn)換為不同的編碼以方便應(yīng)用程序調(diào)用,比如在DOS系統(tǒng)下的ASCII碼,在Windows系統(tǒng)下的虛擬鍵盤碼等等。

有時我們希望能以程序的方式模擬鍵盤按鍵,以達到自動輸入文字或者控制操作的目的。在DOS系統(tǒng)下通常使用中斷調(diào)用,產(chǎn)生鍵盤的掃描碼的方法來實現(xiàn)。在Windows 系統(tǒng)下,由于Windows本身的一些限制和特點,一般不直接使用中斷調(diào)用。
了解一點Windows編程的朋友應(yīng)該知道, Windows系統(tǒng)是通過消息的傳遞(或稱事件的發(fā)生)來控制各個應(yīng)用程序的執(zhí)行和數(shù)據(jù)通信的。例如:應(yīng)用程序打開和關(guān)閉會產(chǎn)生相應(yīng)的窗口消息,鼠標的移 動、點擊動作會產(chǎn)生相應(yīng)的鼠標消息,同樣鍵盤的按下、彈起也會產(chǎn)生相應(yīng)的鍵盤消息。那么如果用程序產(chǎn)生鍵盤消息,也就達到了模擬鍵盤按鍵的目的。

有了這樣的思路,我們現(xiàn)在就來實驗一下。
首先要知道在Windows系統(tǒng)中與鍵盤按鍵相關(guān)的消息有:WM_KEYDOWN、 WM_KEYUP、 WM_SYSKEYDOWN、WM_SYSKEYUP、WM_CHAR等。其中,WM_KEYDOWN為鍵按下,WM_KEYUP為鍵彈起, WM_SYSKEYDOWN為系統(tǒng)鍵按下,WM_SYSKEYUP為系統(tǒng)鍵彈起,WM_CHAR為按鍵對應(yīng)的字符。
要模擬鍵盤產(chǎn)生鍵盤消息,我們就發(fā)送一條鍵盤消息給指定窗口。比如要模擬一個字母鍵“A”,可以這樣:PostMessage(hWnd, WM_CHAR, 'A', 0); 模擬按一個回車:PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0)。這里的關(guān)鍵問題是要確定窗口句柄(hWnd),使用GetFocus()函數(shù)可以得到鍵盤光標所在窗口句柄,但該函數(shù)只能得到當前進程內(nèi)的窗口句 柄。
如果要得到其他應(yīng)用程序的鍵盤光標所在窗口句柄,需要調(diào)用 AttachThreadInput()函數(shù)。該函數(shù)的作用就是將其他窗口線程的輸入附加到本窗口線程的輸入操作中,這樣就可以調(diào)用GetFocus()函數(shù)得到其他窗口的句柄了。
與2001年第24期程序谷刊登的《如何寫一個聊天輔助程序》一文中作者使用ChildWindowFromPointEx的方法相比,使用AttachThreadInput似乎更能夠使鍵盤模擬具有通用性。

AttachThreadInput()函數(shù)的原形如下:

BOOL AttachThreadInput(

DWORD idAttach, // 需要附加的線程ID

DWORD idAttachTo, // 附加到的線程ID

BOOL fAttach // true 附加 false 取消

);

函數(shù)使用的過程大致如下:


HWND hWnd;

hWnd = GetForegroundWindow(); // 得到當前窗口

if (hWnd == Form1->Handle) return; // 排除程序本身的窗口

DWORD FormThreadID = GetCurrentThreadId(); // 本程序的線程ID

// 當前窗口的線程ID

DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);

// 附加輸入線程

AttachThreadInput(CWndThreadID, FormThreadID, true);

// 得到當前鍵盤光標所在的窗口

hWnd = GetFocus();

// 取消附加的輸入線程

AttachThreadInput(CWndThreadID, FormThreadID, false);

hWnd就是當前鍵盤光標所在的窗口句柄。另外,經(jīng)過測試發(fā)現(xiàn),在Windows2000系統(tǒng)下發(fā)送字符消息(WM_CHAR)時,如果字符是一個漢 字,則該字符對應(yīng)的虛擬鍵盤碼高位不為0,這樣得到的字符就不正確。解決辦法是做一個“與”運算: ch & 0xFF就可以了。
下面又到了給出例程的時間了。例程“刷刷刷”能夠在鍵盤光標所在的文本輸入框中自動輸入文字(中文、英文、數(shù)字),程序使用C++ Builder 5開發(fā)。首先運行C++ Builder并新建工程。接著,將窗體Form1的邊框樣式(BorderStyle)改為對話框(bsDialog),并放置相應(yīng)控件如圖所示,其中 SS_Text是一個用于輸入文本的TComboBox控件,當然,你可以在設(shè)計階段預(yù)先向控件中輸入一些常用文本,以便程序運行后可以直接選用; txtTimes和txtDelay為TEdit控件,分別用于控制發(fā)送文本的次數(shù)和間隔時間;chkAutoWrap和chkAutoNumber為 TCheckBox控件,決定是否在每一行發(fā)送文本后面自動回車或自動加記數(shù)編號; 以上控件包含在Panel1(TPanel控件)中; Timer1用于控制循環(huán)發(fā)送和時間間隔。

下面是程序清單:

//--------------------------------------------

#include

#pragma hdrstop

#include "Unit1.h"

//--------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"


int nTotalTimes, // 發(fā)送本文的總次數(shù)

nTimes; // 已經(jīng)發(fā)送的次數(shù)

TForm1 *Form1;

//--------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//--------------------------------------------

void __fastcall TForm1::btnStartClick(TObject *Sender) // 開始刷屏

{ if (SS_Text->Text.IsEmpty())

{

// 文本不能為空

ShowMessage("請輸入刷刷文本!");

SS_Text->SetFocus();

return;

}

__try

{

// Timer1->Interval取值為n秒(最小為50毫秒)

int Interval = StrToInt(txtDelay->Text);

Timer1->Interval = (Interval > 0) ? Interval * 1000 : 50;

// nTotalTimes取值為n次(最小為0次)

nTotalTimes = StrToInt(txtTimes->Text);

if (nTotalTimes < 0)

nTotalTimes = 0;

nTimes = 0;

Timer1->Enabled = true;

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

ShowMessage("請輸入數(shù)值類型數(shù)據(jù)!");

return;

}

btnStart->Enabled = false;

btnStop->Enabled = true;

Panel1->Enabled = false;

Application->Minimize(); // 最小化刷刷窗口

}

//--------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender)// 停止刷屏

{

Timer1->Enabled = false;

btnStart->Enabled = true;

btnStop->Enabled = false;

Panel1->Enabled = true;

}

//--------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

// 現(xiàn)刷屏nTimes次,到nTotalTimes次后完成。

if (nTimes == nTotalTimes)

{

btnStopClick(Sender);

return;

}


HWND hWnd;

hWnd = GetForegroundWindow(); // 得到當前窗口

if (hWnd == Form1->Handle) return; // 不需要程序本身的窗口


DWORD FormThreadID = GetCurrentThreadId();

DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);


// 附加輸入線程

AttachThreadInput(CWndThreadID, FormThreadID, true);

hWnd = GetFocus(); // 得到當前鍵盤光標所在的窗口

AttachThreadInput(CWndThreadID, FormThreadID, false); // 取消

if (hWnd == NULL) return;


nTimes++;

for (int i = 1; i <= SS_Text->Text.Length(); i++)

{ // 模擬鍵盤按鍵輸入文本

PostMessage(hWnd, WM_CHAR, (WPARAM)(SS_Text->Text[i] & 0xFF), 0);
}
if (chkAutoNumber->Checked)

{ // 自動編號

AnsiString Lines = IntToStr(nTimes);

for (int j = 1; j <= Lines.Length(); j++)

PostMessage(hWnd, WM_CHAR, (WPARAM)(Lines[j]), 0);

}

if (chkAutoWrap->Checked) // 自動回車

PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);

}
//---------------------------------------------

本程序在Windows 2000 + C++ Builder 5下編譯通過。源程序下載地址是:[url]http://www.cfan.net.cn/qikan/[/url] cxg/0206mnj.zip。

本文轉(zhuǎn)自博客園知識天地的博客,原文鏈接:在VC中實現(xiàn)模擬鍵盤,輸入內(nèi)容并顯示在ListBox中。?,如需轉(zhuǎn)載請自行聯(lián)系原博主。

總結(jié)

以上是生活随笔為你收集整理的在VC中实现模拟键盘,输入内容并显示在ListBox中。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。