Win32API ウィンドウを移動させる MoveWindow
MoveWindow関数で、ウィンドウの位置や大きさを設定することができる。
MoveWindow関数のプロトタイプ
BOOL MoveWindow( HWND hWnd, // ウィンドウのハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int nWidth, // 幅 int nHeight, // 高さ BOOL bRepaint // 再描画オプション );
MoveWindow関数を使用した簡単なサンプルプログラム
ノートパッドを起動し、ノートパッドのウィンドウを移動させる#include <windows.h> #include <stdlib.h> BOOL CALLBACK WndEnumProc(HWND hWnd, LPARAM) { char szClassName[256]; ::GetClassNameA(hWnd, szClassName, _countof(szClassName)); if (::lstrcmpiA(szClassName, "NOTEPAD") == 0) { MoveWindow(hWnd, 0, 0, 300, 300, TRUE); Sleep(1000); MoveWindow(hWnd, 300, 300, 300, 300, TRUE); Sleep(1000); MoveWindow(hWnd, 500, 500, 300, 300, TRUE); } return TRUE; } int main() { WinExec("notepad", SW_SHOW); ::EnumWindows(WndEnumProc, 0); return 0; }
もう少し発展させて、ノートパッドがデスクトップ上を円を描いて回るようにする
#include <windows.h> #include <stdlib.h> #include <math.h> #define PI 3.14 #define NUMBER_OF_ROTATE 3 double DegreeToRadian(double deg) { return deg * (PI / 180.0); } void TurnWindow(HWND hWnd) { int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); double r = nHeight/4; for (int i = 0; i < 360*NUMBER_OF_ROTATE; i+=1) { double radian = DegreeToRadian(i); double x = r * cos(radian) + nWidth/2; double y = r * sin(radian) + nHeight/2; SetForegroundWindow(hWnd); MoveWindow(hWnd, (int)x, (int)y, 300, 300, TRUE); Sleep(5); } } BOOL CALLBACK WndEnumProc(HWND hWnd, LPARAM) { char szClassName[256]; ::GetClassNameA(hWnd, szClassName, _countof(szClassName)); if (::lstrcmpiA(szClassName, "NOTEPAD") == 0) { TurnWindow(hWnd); } return TRUE; } int main() { WinExec("notepad", SW_SHOW); ::EnumWindows(WndEnumProc, 0); return 0; }