ユーザーがホットキーをカスタマイズして特定の機能を実行できるようにするプログラムを作成しています。
最初に作成した関数は、カーソルをゲーム ウィンドウ内の特定の座標セットに移動します。これは、クライアント領域を見つけて、設定された座標を追加し、そこにカーソルを移動することによって行われます。ただし、SetCursorPos が呼び出されるたびに、2 回移動するように見えます。最初は正しい場所である to (0,0) に移動します。何が原因なのかわからず、グーグルで何時間もかけてデバッグしましたが、役に立ちませんでした。2回動くことを除いて、すべてが正しく機能します。私は Windows 8 を使用しており、Code::Blocks でコンパイルしています。
スクリプトは、マウスが移動する前と移動した後に移動する必要がある座標も出力します。それらは同じでなければなりません。また、ホットキーを押したときに「キーダウン」を出力し、離したときに「キーアップ」を出力します。
F1 を押すと、マウスが動きます。
#include <iostream>
#include <windows.h>
using namespace std;
class macro{
public:
int x, y, w, h;
HWND hWnd;
HWND get_hWnd(){
hWnd = FindWindow(NULL,"Untitled - Notepad");
return hWnd;
}
void get_Pos(){
RECT pos;
GetClientRect(hWnd,(LPRECT)&pos);
ClientToScreen(hWnd,(LPPOINT)&pos.left);
ClientToScreen(hWnd,(LPPOINT)&pos.right);
w = pos.right;
h = pos.bottom;
x = pos.left;
y = pos.top;
}
void activate(){
ShowWindow(hWnd, SW_SHOWMAXIMIZED);
}
void initialize(){
get_hWnd();
get_Pos();
}
void mousemove(int rx, int ry){
get_Pos();
cout << "Pre-move: " << rx+x << "," << ry+y << endl;
SetCursorPos(rx + x,ry + y);
cout << "Post-move: " << rx+x << "," << ry+y << endl;
}
}macro;
int main(){
macro.initialize();
bool loop = true;
bool action_complete = true;
int prev = 0;
int curr = 0;
bool key_state; // True if down, false if up.
while(loop){
if(GetAsyncKeyState(0x70)){
curr = 1;
}
else{
curr = 0;
}
if (prev != curr){
if(curr){
key_state = true;
macro.mousemove(100,100);
cout << "key down" << endl;
Sleep(100);
}
else{
key_state = false;
cout << "key up" << endl;
Sleep(100);
}
prev = curr;
}
}
}