まずはマウスによる操作をプログラムで再現したいと思っているのですが、
マウス位置の移動、クリック、右クリック、ダブルクリックは再現できたものの
ドラッグ&ドロップの再現が出来なくて困っています。
(ドラッグ&ドロップを再現して、デスクトップ上のアイコンを移動させようとしたのですが期待通りの動作になりませんでした。
単純に”移動→クリック→移動→クリックOFF”となるだけで、アイコンが移動しない状態です。)
どうすればドラッグ&ドロップを再現することが出来るのか教えて頂けないでしょうか。
初投稿で質問自体に不備があるかもしれませんが、そちらも合わせて指摘して頂けると幸いです。
よろしくお願いします。
下記が問題のプログラムです。
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, "wsock32.lib")
#define WIN32_LEAN_AND_MEAN
//【関数】
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); // コールバック関数
//【変数】
HINSTANCE global_hInstance;
HDC global_hInvisibleMainDC;
//////////////////// Main 関数 ////////////////////
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
MSG msg;
WNDCLASS wndclass;
HWND hMainWindow;
HDC hMainDC, hInvisibleMainDC;
HBITMAP hInvisibleMainBitmap;
global_hInstance = hInst;
// MainWindow 作成
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; // 縦、横のサイズ変更時に再描画。ダブルクリック検出。
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = wndclass.cbWndExtra = 0;
wndclass.hInstance = hInst;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = TEXT("MainWindow");
if(!RegisterClass(&wndclass)) return NULL;
hMainWindow = CreateWindow(
TEXT("MainWindow"), TEXT("MainWindow (RemoteController)"),
WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX ,
100, 100, (60*4)+8, (60*3)+27,
NULL, NULL, hInst, NULL
);
if(hMainWindow==NULL) return -1;
hMainDC = GetDC(hMainWindow);
// InvisibleWindow 作成
hInvisibleMainDC = CreateCompatibleDC(hMainDC); // メモリデバイスコンテキストのハンドル取得(幅1、高さ1)
hInvisibleMainBitmap = CreateCompatibleBitmap(hMainDC, (60*4), (60*3)); // hBitmap の幅、高さを設定
SelectObject(hInvisibleMainDC , hInvisibleMainBitmap); // メモリデバイスコンテキストに hBitmap の幅、高さを取得(拡張)
global_hInvisibleMainDC = hInvisibleMainDC;
// InvisibleWindow を白で塗潰し
SelectObject(hInvisibleMainDC , GetStockObject(WHITE_BRUSH)); // ブラシを白に変更
Rectangle(hInvisibleMainDC, -1, -1, (60*4)+1, (60*3)+1); // InvisibleWindow の描画領域より1ピクセル外側に黒線の枠
TextOut(hInvisibleMainDC, (60*4)/2-50, (60*3)/3, TEXT("なうろ~でぃんぐ"), 16);
SelectObject(hInvisibleMainDC , GetStockObject(NULL_BRUSH)); // ブラシをNULLに変更
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
////////////////////////////// CALLBACK 関数 //////////////////////////////
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){
static LONG width, height;
switch(msg){
case WM_KEYDOWN:
switch(wp){
case VK_LEFT: // デスクトップ上の点(x=20, y=100)クリックを再現
SetCursorPos(20, 100);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
break;
case VK_UP: // デスクトップ上の点(x=20, y=100)ダブルクリックを再現
SetCursorPos(20, 100);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
break;
case VK_RIGHT: // デスクトップ上の点(x=20, y=100)右クリックを再現
SetCursorPos(20, 100);
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
break;
case VK_DOWN: // デスクトップ上の点(x=20, y=100)→(x=220, y=100)にドラッグ&ドロップ
SetCursorPos(20, 100);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
SetCursorPos(220, 100);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
break;
case VK_RETURN:
break;
default:
break;
}
return 0;
case WM_PAINT: // 再描画
HDC hPaintDC;
HDC hInvisiblePaintDC;
PAINTSTRUCT ps;
hPaintDC = BeginPaint(hwnd, &ps);
hInvisiblePaintDC = global_hInvisibleMainDC;
StretchBlt(
hPaintDC, 0 , 0 , width, height,
hInvisiblePaintDC, 0 , 0 , (60*4), (60*3), SRCCOPY
);
EndPaint(hwnd, &ps);
return 0;
case WM_SIZE: // サイズ変更
RECT rect;
GetWindowRect(hwnd, &rect);
width = (rect.right - rect.left) - 8; // Window の枠:8ピクセル
height = (rect.bottom - rect.top) - 27; // Window の枠:27ピクセル
return 0;
case WM_CREATE:
width = (60*4);
height = (60*3);
return 0;
case WM_CLOSE: // ウィンドウを閉じる
//MessageBox(hBaseWindow, TEXT("終了します\n\n(保存確認など)"), TEXT("close"), MB_OK);
break;
case WM_DESTROY: // ウィンドウ破棄
//ReleaseDC(hMainWindow, hMainDC);
//DeleteObject(hInvisibleMainBitmap);
//DeleteDC(hInvisibleMainDC);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}