線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3685
推到 Plurk!
推到 Facebook!

鍵盤訊號 和 模擬鍵盤訊號 有什麼不同呢?

尚未結案
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-03 20:29:34 IP:218.172.xxx.xxx 訂閱
各位大大:

小弟想寫一隻程式可以送出鍵盤訊息

而我也在網路上找到符合我需求的資訊

也寫了一支程式 的確也能正確的發送鍵盤訊息至TXT檔內

可是奇怪的是當我打開線上遊戲以後 再開啟我所寫的程式並且執行

卻發現在遊戲中 沒有做出相對應鍵盤訊息的動作

我以為我寫的程式並沒有執行 所以我回到桌面開啟TXT檔 結果我的程式的確是有在跑 也一直持續送出訊號

例如:在TXT檔內可以一直寫入字母K 但是在遊戲裡面卻不會執行K所對應的動作

而且我弟弟今天去買搖桿 附加的軟體卻可以把搖桿訊息模擬成鍵盤訊息 也能在TXT檔和遊戲中產生對應的動作

這到底是為什麼呢 附上我的程式碼 哪裡出錯了......麻煩各位了

我是用TIMER去連續發出訊號的


[code cpp]
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float JUMP,DRING;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered=true;
Timer1->Enabled=false;
Timer2->Enabled=false;

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
JUMP =StrToFloat(Form1->Edit1->Text);
DRING =StrToFloat(Form1->Edit2->Text);
Timer1->Interval=100*JUMP;
Timer1->Enabled=true;
Timer2->Interval=100*DRING;
Timer2->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=false;
Timer2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int keyA=65;
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONDOWN ,0);
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONUP ,0);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
int keyB=66;
keybd_event(keyB, MapVirtualKey(keyB,0), WM_LBUTTONDOWN ,0);
keybd_event(keyB, MapVirtualKey(keyB,0),WM_LBUTTONUP ,0);
}
//---------------------------------------------------------------------------

[/code]


------
恩...
編輯記錄
istillloving 重新編輯於 2009-08-03 20:30:58, 註解 無‧
HUNK999
初階會員


發表:9
回覆:35
積分:28
註冊:2009-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-05 18:19:21 IP:220.130.xxx.xxx 訂閱
猜的:

你的記錄檔Keyboard的確有按到... 可能是...

線上Game 只接受Virtual Key 的訊息(VM_XXXX) , 不是Keyboard 標準的訊息 (WM_XXXX)



===================引 用 istillloving 文 章===================
各位大大:

小弟想寫一隻程式可以送出鍵盤訊息

而我也在網路上找到符合我需求的資訊

也寫了一支程式 的確也能正確的發送鍵盤訊息至TXT檔內

可是奇怪的是當我打開線上遊戲以後 再開啟我所寫的程式並且執行

卻發現在遊戲中 沒有做出相對應鍵盤訊息的動作

我以為我寫的程式並沒有執行 所以我回到桌面開啟TXT檔 結果我的程式的確是有在跑 也一直持續送出訊號

例如:在TXT檔內可以一直寫入字母K 但是在遊戲裡面卻不會執行K所對應的動作

而且我弟弟今天去買搖桿 附加的軟體卻可以把搖桿訊息模擬成鍵盤訊息 也能在TXT檔和遊戲中產生對應的動作

這到底是為什麼呢 附上我的程式碼 哪裡出錯了......麻煩各位了

我是用TIMER去連續發出訊號的


[code cpp]
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float JUMP,DRING;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered=true;
Timer1->Enabled=false;
Timer2->Enabled=false;

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
JUMP =StrToFloat(Form1->Edit1->Text);
DRING =StrToFloat(Form1->Edit2->Text);
Timer1->Interval=100*JUMP;
Timer1->Enabled=true;
Timer2->Interval=100*DRING;
Timer2->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=false;
Timer2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int keyA=65;
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONDOWN ,0);
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONUP ,0);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
int keyB=66;
keybd_event(keyB, MapVirtualKey(keyB,0), WM_LBUTTONDOWN ,0);
keybd_event(keyB, MapVirtualKey(keyB,0),WM_LBUTTONUP ,0);
}
//---------------------------------------------------------------------------

[/code]


編輯記錄
HUNK999 重新編輯於 2009-08-05 18:24:15, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-05 20:55:40 IP:125.225.xxx.xxx 未訂閱
普通的API都會被遊戲擋下來,可以試試更低階的技術
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=80850
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-05 22:43:28 IP:220.129.xxx.xxx 訂閱
您好:

可不可以再請教一下

一般我們按下鍵盤到底是發送什麼訊號給電腦呢??
------
恩...
HUNK999
初階會員


發表:9
回覆:35
積分:28
註冊:2009-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-06 11:00:02 IP:220.130.xxx.xxx 訂閱

KeyBoard是HID Device:

Device 發 USB封包到PC的USB Receiver , 經由SIE 到OS , OS的Driver再透過AP發出Windows Keyboard事件

===================引 用 istillloving 文 章===================
您好:

可不可以再請教一下

一般我們按下鍵盤到底是發送什麼訊號給電腦呢??
編輯記錄
HUNK999 重新編輯於 2009-08-06 14:46:45, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-06 23:04:53 IP:218.169.xxx.xxx 訂閱
大大您好:

那可以再請教 我所寫的程式是再這流程哪一段插入的呢?

還是是兩種不同的方法來達到Windows Keyboard事件?

麻煩您了

===================引 用 HUNK999 文 章===================

KeyBoard是HID Device:

Device 發 USB封包到PC的USB Receiver , 經由SIE 到OS , OS的Driver再透過AP發出Windows Keyboard事件

===================引 用 istillloving 文 章===================
您好:

可不可以再請教一下

一般我們按下鍵盤到底是發送什麼訊號給電腦呢??
------
恩...
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-07 13:27:12 IP:218.172.xxx.xxx 訂閱
大大您好:

我試過了用VK_也是不行

會不會是他只接受 較低階的訊息然後遊戲在自己模擬成鍵盤事件

===================引 用 HUNK999 文 章===================
猜的:

你的記錄檔Keyboard的確有按到... 可能是...

線上Game 只接受Virtual Key 的訊息(VM_XXXX) , 不是Keyboard 標準的訊息 (WM_XXXX)



===================引 用 istillloving 文 章===================
各位大大:

小弟想寫一隻程式可以送出鍵盤訊息

而我也在網路上找到符合我需求的資訊

也寫了一支程式 的確也能正確的發送鍵盤訊息至TXT檔內

可是奇怪的是當我打開線上遊戲以後 再開啟我所寫的程式並且執行

卻發現在遊戲中 沒有做出相對應鍵盤訊息的動作

我以為我寫的程式並沒有執行 所以我回到桌面開啟TXT檔 結果我的程式的確是有在跑 也一直持續送出訊號

例如:在TXT檔內可以一直寫入字母K 但是在遊戲裡面卻不會執行K所對應的動作

而且我弟弟今天去買搖桿 附加的軟體卻可以把搖桿訊息模擬成鍵盤訊息 也能在TXT檔和遊戲中產生對應的動作

這到底是為什麼呢 附上我的程式碼 哪裡出錯了......麻煩各位了

我是用TIMER去連續發出訊號的


[code cpp]
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float JUMP,DRING;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered=true;
Timer1->Enabled=false;
Timer2->Enabled=false;

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
JUMP =StrToFloat(Form1->Edit1->Text);
DRING =StrToFloat(Form1->Edit2->Text);
Timer1->Interval=100*JUMP;
Timer1->Enabled=true;
Timer2->Interval=100*DRING;
Timer2->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=false;
Timer2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int keyA=65;
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONDOWN ,0);
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONUP ,0);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
int keyB=66;
keybd_event(keyB, MapVirtualKey(keyB,0), WM_LBUTTONDOWN ,0);
keybd_event(keyB, MapVirtualKey(keyB,0),WM_LBUTTONUP ,0);
}
//---------------------------------------------------------------------------

[/code]

------
恩...
HUNK999
初階會員


發表:9
回覆:35
積分:28
註冊:2009-07-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-07 23:39:41 IP:118.169.xxx.xxx 訂閱
我認為原因可能出在視窗焦點(Window Focus) , 當Game在執行時 , 你設計的API雖然發送訊號 , 但本身AP失去焦點 ..

同理 , 當你將焦點切至你的AP , Game本身已無法接受你的事件訊號...

這當然也有例外....一些特別製作的程式在失去焦點時仍會動作 ..

另一方面 , 寫檔動作與焦點無關 , 因此遊戲在動作時 , 仍可以做WriteFIle動作...

你可以寫兩個AP , 一個負責發送Keyboard訊息 , 一個負責息顯示訊息在"Dialog 物件"上 ,

再同時執行這兩個程式 , Window 焦點放在負責發送訊息的AP上...再去觀察另一個AP就知道了...

===================引 用 istillloving 文 章===================
大大您好:

我試過了用VK_也是不行

會不會是他只接受 較低階的訊息然後遊戲在自己模擬成鍵盤事件

===================引 用 HUNK999 文 章===================
猜的:

你的記錄檔Keyboard的確有按到... 可能是...

線上Game 只接受Virtual Key 的訊息(VM_XXXX) , 不是Keyboard 標準的訊息 (WM_XXXX)



===================引 用 istillloving 文 章===================
各位大大:

小弟想寫一隻程式可以送出鍵盤訊息

而我也在網路上找到符合我需求的資訊

也寫了一支程式 的確也能正確的發送鍵盤訊息至TXT檔內

可是奇怪的是當我打開線上遊戲以後 再開啟我所寫的程式並且執行

卻發現在遊戲中 沒有做出相對應鍵盤訊息的動作

我以為我寫的程式並沒有執行 所以我回到桌面開啟TXT檔 結果我的程式的確是有在跑 也一直持續送出訊號

例如:在TXT檔內可以一直寫入字母K 但是在遊戲裡面卻不會執行K所對應的動作

而且我弟弟今天去買搖桿 附加的軟體卻可以把搖桿訊息模擬成鍵盤訊息 也能在TXT檔和遊戲中產生對應的動作

這到底是為什麼呢 附上我的程式碼 哪裡出錯了......麻煩各位了

我是用TIMER去連續發出訊號的


[code cpp]
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float JUMP,DRING;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DoubleBuffered=true;
Timer1->Enabled=false;
Timer2->Enabled=false;

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
JUMP =StrToFloat(Form1->Edit1->Text);
DRING =StrToFloat(Form1->Edit2->Text);
Timer1->Interval=100*JUMP;
Timer1->Enabled=true;
Timer2->Interval=100*DRING;
Timer2->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=false;
Timer2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int keyA=65;
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONDOWN ,0);
keybd_event(keyA, MapVirtualKey(keyA,0),WM_LBUTTONUP ,0);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
int keyB=66;
keybd_event(keyB, MapVirtualKey(keyB,0), WM_LBUTTONDOWN ,0);
keybd_event(keyB, MapVirtualKey(keyB,0),WM_LBUTTONUP ,0);
}
//---------------------------------------------------------------------------

[/code]

編輯記錄
HUNK999 重新編輯於 2009-08-07 23:44:15, 註解 無‧
系統時間:2017-10-22 5:27:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!