鏶嶅嚑澶┼沄CKbase镄勤椂炼櫕湅鍒颁简杩欐牁涓绡呸枃裤狅细http://www.vckbase.com/document/viewdoc/?id=1415銆傛枃裤犱竴寮濮嫔氨浠嬬肃滨骨熀链畻娉曪纴鍗冲厅銮峰缑QQ杩闪绰鐪嬬獥鍙e彝镆彻纴铹惰屻幏寰楀叾DC锛出扐钖庡姣仁釜鏂规牸杩渎棰滆坏鍙栨牁锛屻绠楀嚭姣忕鏂规牸镄勯鑹茬壒寰佸碱纴鏋勯豺嚭鏂规牸锏瑰緛锇┼樀锛岸渜璇烦阒典芄瀹炵帮杩闪绰鐪嬬殑绠楁碜锛屾ā鎷熼紶镙囩偣鍑讳簨浠躲?/font>
鏂囩碔杩樼稃滨嗕竴娈靛剐阌殑浠g爜锛岸嵇鏋勯豹楠镙肩壒寰佺烦阒甸儴鍒嗙殑浠g爜銆备笉杩囱佸疄璇达纴闾d塞浠g爜澶毦鐪嬩简锛岸懡钖嶆贩涔卞缑寰堬纴鎴戠湅滨嗙湅婧愪唬镰觥纴姣旒偅涓洿绯燂纴锘烘湰娌℃敞阅娿备笉杩呸棦铹剁煡阆扑简绠楁碜锛屻嚜宸卞启涔熻姣旇闾d塞阌剧湅镄跷唬镰佹撒寰楁洿蹇竴滨莅?/font>
缁忚绷瀹为獙锛屼綔钥呯殑绠楁碜镄动『涓嶉敊锛岸嗳纭巼鎺繎100锛他纴鍙湁4绉嶅乏鍙崇殑鏂规牸镞豹碜璇骨埆銆备絾鏄伞涓笉鏄梾棰桡纴鍙渶瑕佸晓鍙栨牁镣瑰锷豺埌6涓氨鍙互杈惧埌寰堥佩镄勫垎杈ㄨ始锷涗简銆备絾鏄渜妯℃嫙榧豹爣镄剧绷绋嬩腑阆囧埌滨嗕竴滨涢夯鐑︺备竴寮濮嬩娇鐢╩ouse_event妯℃嫙榧豹爣镄勫崟鍑伙纴浣奚槸链始濡傛效浠信锛屾疮娆〞彧鑳藉崟鍑讳竴涓楠镙碱纴镞豹碜鍗曞向绗簩涓效悗鏉张璇曚简璇昐endInput锛岄梾棰树緷镞效幓CSDN涓婇涗简阃涳纴娌′粈涔垄敹銮凤纴鐜板渜杩树笉锇亡哄鍑哄渜鍝噷锛出湅鏉缮寰匾嚜宸辨参鎱三爷绌躲?/font>
璇暸獙杩囧悗锛屻寰楀螭浠晓杩郁釜镐濊矾鐢ㄥ埌绫讳技镄勤父鎴仁腑锛屾瘮濡俀Q瀵瑰纰般傛瀯阃犵壒寰佺烦阒电殑鏂规碜涓镙凤纴鍙笉杩呸父鎴忕畻娉曚笉涓镙疯岸凡銆?/font>
闄彻细鎴戠殑Code锛出畻娉晨湁寰埚镄勤敼杩涗捆鍦般?/font>
// For SendInput() and INPUT Struct
#include "Winable.h"
//
// 涓滨涘父阅忏拰锁版嵁镄勫畾涔?/font>
// 镊畾涔倨秷镇?br/>#define MM_DONE WM_USER + 1000
// 绌烘牸
#define GRID_BLANK (0)
// QQ杩闪绰鐪嬬殑娓告垙鍖烘楠镙兼槸11琛?times;19鍒?br/>#define ROWS 11
#define COLS 19
// 娓告垙鍖虹浉瀵逛簬瀹二垌鍖虹殑锅忕锛埚螭浠敼鍙桡级
#define YCOFFSET 181
#define XCOFFSET 14
// 杩闪绰鐪嬫楠镙肩殑灏哄锛埚螭浠敼鍙桡级
#define WIDTH 31
#define HEIGHT 35
// 姣仁釜鏂规牸镄勫彇镙风偣涓暟锛埚螭浠敼鍙桡级
#define SAMPLES 4
// 钖勫彇镙风偣燧稿滨庢楠镙煎乏涓匊镄勫亸绉婚噺锛埚螭浠敼鍙桡级
const static POINT g_Offsets[SAMPLES] = {
{15, 17},
{11, 19},
{16, 17},
{21, 17}
};
// 鍒柇涓涓嶅伣棰滆坏镄勫宸纸鍙互鏀瑰彉锛?br/>#define TOLERANCE 15
// 鏂规牸缁撴瀯
typedef struct _GRID_{
// 鏂规牸镄动被鍒献D锛地ash锛多纴澶簬绛变簬0锛?涓虹└镙笺?br/> // 瀹幂殑浣灭敤寰垄梅鏄撅纴鍙湁钖出被镄勤楠镙兼墠鍙始琚秷闄?br/> int iID;
// 璇楠镙间腑蹇富潗镙囷纸瀹二垌镄彻纴涓轰简阆垮历锲犱负杩闪绰鐪嬬獥鍙d綅缃发鐢熷彉鍖枻甫鏉殑哄锛?br/> CPoint pt;
// 璇楠镙肩殑鍙栨牁镣圭殑棰滆坏銆效町镄跷綔鐢ㄦ槸涓轰简宁侄纭畾镓链倨楠镙肩殑iID銆?br/> COLORREF cl[SAMPLES];
}GRID;
// 锁翠釜娓告垙鍖烘塈链夌殑鏂规牸
static GRID g_Grid[ROWS][COLS];
// 褰揿墠镄勤楠镙肩绫筹D(Hash)链澶?br/>static int g_iGridID = 0;
// 浣滃纷鍣ㄧ獥鍙e彝镆勚傜稃瀹富发阃佹秷镇殑镞跺栾鐢ㄥ埌
static HWND g_hThisWnd = NULL;
// 杩闪绰鐪?HWND
static HWND g_hLLKWnd = NULL;
//
// 涓滨渎緟锷┼畯
// 銮峰缑RGB涓垎阅?br/>#define B(X) (GetBValue(X))
#define G(X) (GetGValue(X))
#define R(X) (GetRValue(X))
// 姣旇缉澶曤
#define MIN(X, Y) ((X) > (Y) ? (Y) : (X))
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
// 宸殑缁濆炼?br/>#define ABS(X, Y) ((X) < (Y) ? (Y) - (X) : (X) - (Y))
//////////////////////////////////////////////////////////////////
// 璁$畻涓棰滆坏涓垎阅忕殑宸间莿鍜?br/>int Difference(const COLORREF &c1, const COLORREF &c2)
{
return ABS(R(c1), R(c2))
+ ABS(G(c1), G(c2))
+ ABS(B(c1), B(c2));
}
// 鍦ㄧ烦阒典腑镆垒鍜屾宝瀹氶鑹茬殑宸埆鍦ㄥ宸寖锲村唴镄勤楠镙?r, c)銆效鏋滀笉瀛桦渜鍒栾繑锲?锛?1,
// 钖﹀垯杩斿洖0鍜屻棰滆坏镓鍦ㄦ楠镙肩殑浣岖疆銆?br/>int FindColor(const COLORREF cl[SAMPLES], int &r, int &c)
{
int i, j, k, iDiff;
for(i = 0; i < ROWS; i ++)
{
for(j = 0 ; j < COLS; j ++)
{
// 涓岖敤鍜出└镙兼瘮杈?br/> if(g_Grid[i][j] .iID == GRID_BLANK)
continue;
iDiff = 0;
// 璁$畻璇鑹插拰镌囧畾棰滆坏涔嬮輗镄勫樊鍒?br/> for(k = 0; k < SAMPLES; k ++)
{
iDiff += Difference(g_Grid[i][j] .cl[k], cl[k]);
}
if(iDiff <= TOLERANCE)
{
// 镓惧埌
r = i;
c = j;
return 0;
}
}
}
return - 1;
}
// 阃氲绷鍙栨牁镣圭殑RGB炼肩『瀹氢竴涓楠镙肩殑绫诲埆ID(Hash)
int GetGridID(const COLORREF cl[SAMPLES])
{
// 镙规嵁棰滆坏灏奚楠镙煎垎绫?br/> for(int i = 0; i < SAMPLES; i ++)
{
// 绌烘牸镄凭GB鍒嗛噺锣富洿
// R(44~74), G(49~91), B(102~103)
if (R(cl[i]) > 44 && R(cl[i]) < 74
&& G(cl[i]) > 49 && G(cl[i]) < 91
&& B(cl[i]) > 102 && R(cl[i]) < 130)
{
}
else
{
// 鏄惁宸茬粡瀛桦渜锛?br/> int r, c;
if(FindColor(cl, r, c) == - 1)
{
// 涓嶅瓨鍦?鍒欐坊锷?br/> g_iGridID ++;
return g_iGridID;
}
else
{
// 瀛桦渜鍒栾繑锲滨D
return g_Grid[r][c] .iID;
}
}
}
// 绌烘牸
return GRID_BLANK;
}
// 铌憡阌栾
void ReportError(CString strMsg)
{
AfxMessageBox(strMsg);
}
// 銮峰缑娓告垙鏂规牸锏瑰緛锇┼樀
BOOL InitMatrix(HWND hWnd)
{
// 銮峰缑杩闪绰鐪婥Wnd
CWnd* pWnd = CWnd ::FromHandle(hWnd);
if(NULL == pWnd)
return FALSE;
// 杩闪绰鐪嬫渶灏忏寲滨嗭纻
if(pWnd ->IsIconic())
{
pWnd ->ShowWindow(SW_RESTORE);
Sleep(1048);
}
// 杩闪绰鐪嬫病链倨縺娲伙纻
if(pWnd ->GetActiveWindow() ->GetSafeHwnd() != hWnd)
{
pWnd ->SetForegroundWindow();
pWnd ->SetActiveWindow();
Sleep(1048);
}
// 銮峰缑杩闪绰鐪嬬殑CDC
CDC* pDC = pWnd ->GetDC();
if(pDC == NULL)
return FALSE;
// 銮峰缑杩闪绰鐪嬫父鎴忏尯宸︿芄瑙掔涓涓楠镙肩殑涓绩鍧愭爣锛埚鎴峰尯镄彻级
CPoint pt(0, 0);
// 銮峰缑瀵瑰簲镓链倨楠镙肩殑锏瑰緛
for(int i = 0; i < ROWS; i ++)
{
// 鏂规牸宸︿芄瑙掔殑Y鍧愭爣
pt .y = YCOFFSET + i * HEIGHT;
for(int j = 0; j < COLS; j ++)
{
// 鏂规牸宸︿芄瑙掔殑X鍧愭爣
pt .x = XCOFFSET + j * WIDTH;
// 淇濆瓨鏂规牸涓绩鍧愭爣锛埚鎴峰尯锛?br/> g_Grid[i][j] .pt .Offset(pt .x + WIDTH / 2, pt .y + HEIGHT / 2);
// 寰楀埌璇楠镙肩殑鍙栨牁镣圭殑RGB
for(int k = 0; k < SAMPLES; k ++)
{
// 濡傛灉鐢ㄦ垌鍏抽棴滨嗙▼搴忕獥鍙?br/> if(::IsWindow(hWnd))
{
g_Grid[i][j] .cl[k] = pDC ->GetPixel(pt .x + g_Offsets[k] .x, pt .y + g_Offsets[k] .y);
}
else
{
// 绐楀彝宸茬粡琚剐哄紒
ReportError(_T("绐楀彝鍦ㄧ纰镰佹椂琚剐哄纴璇锋镆绰杩炵湅镄动姘镐觥纴骞跺皾璇暸吨鏂扮纰镰觥紒"));
return FALSE;
}
}
// 纭畾璇楠镙肩被鍒獭ash
g_Grid[i][j] .iID = GetGridID(g_Grid[i][j] .cl);
TRACE(_T("%4d,"), g_Grid[i][j] .iID);
}
TRACE(_T("\r\n"));
}
return TRUE;
}
// 鍒柇涓釜鍦ㄥ伣涓琛岋纸鍒楋级镄勤楠镙?蹇呴』钖出被锛岸螭浠槸绌烘牸)涔嬮輗鏄惁瀛桦渜燧寸嚎阃氲矾
BOOL GridsConnected(int pivot, int l, int h, BOOL bHorizontal = TRUE)
{
// 鏄惁钖出被锛?br/> if(bHorizontal)
{
if(g_Grid[pivot][l] .iID != g_Grid[pivot][h] .iID)
return FALSE;
}
else
{
if(g_Grid[l][pivot] .iID != g_Grid[h][pivot] .iID)
return FALSE;
}
int L = MIN(l, h);
int H = MAX(l, h);
// 涓釜鏂规牸涔嬮輗蹇呴』閮芥槸绌烘牸
for(int i = L + 1; i < H; i ++)
{
if(bHorizontal)
{
if(g_Grid[pivot][i] .iID != GRID_BLANK)
return FALSE;
}
else
{
if(g_Grid[i][pivot] .iID != GRID_BLANK)
return FALSE;
}
}
return TRUE;
}
// 杈揿嚭璺缎
void OutputPath(int r1, int c1, int r2, int c2)
{
if(r1 == r2 && c1 == c2)
return;
//TRACE(_T(">>>(%d, %d) -> (%d, %d).\r\n"), r1, c1, r2, c2);
}
// 鍒柇涓釜鏂规牸(r1, c1)鍜?r2, c2)(涓嶈始鏄└镙?鏄惁鍙互娑堥櫎
BOOL Match(const int r1, const int c1, const int r2, const int c2)
{
// 涓嶈始鏄└镙?br/> if(g_Grid[r1][c1] .iID == GRID_BLANK
|| g_Grid[r2][c2] .iID == GRID_BLANK)
return FALSE;
// 蹇呴』鏄伣涓绉嶆楠镙?br/> if(g_Grid[r1][c1] .iID != g_Grid[r2][c2] .iID)
return FALSE;
// 璧峰镣圭殑绫诲埆
const int iID = g_Grid[r1][c1] .iID;
// 瀹林滑鍦ㄥ伣涓琛岋纻
if(r1 == r2)
{
if(c1 <= c2)
{
// 瀹林滑涔嬮輗鏄惁链夌洿绾块氲矾锛?br/> if(GridsConnected(r1, c1, c2))
{
OutputPath(r1, c1, r1, c2);
return TRUE;
}
// 鏄惁链绥叾浠栭氲矾锛?br/> for(int i = 0; i < ROWS; i ++)
{
// 宸茬粡鍒柇杩渊简
if(i == r1)
continue;
// 涓釜鎷愮偣蹇呴』鏄└镙?br/> if(GRID_BLANK == g_Grid[i][c1] .iID
&& GRID_BLANK == g_Grid[i][c2] .iID)
{
// 灏嗕袱涓嫄镣圭殑绫诲埆璁剧疆涓篿ID锛出扐钖庡垽鏂槸钖︽湁璺缎
g_Grid[i][c1] .iID = g_Grid[i][c2] .iID = iID;
if(GridsConnected(c1, i, r1, FALSE)
&& GridsConnected(i, c1, c2)
&& GridsConnected(c2, i, r1, FALSE))
{
// OK锛屻缮铡熹被鍒?br/> g_Grid[i][c1] .iID = GRID_BLANK;
g_Grid[i][c2] .iID = GRID_BLANK;
OutputPath(i, c1, r1, c1);
OutputPath(i, c1, i, c2);
OutputPath(i, c2, r1, c2);
return TRUE;
}
else
{
// 涓嶉泛纴鍒欐祴璇曚笅涓鏉¤矾寰彻纴骞朵笖杩桦师鎷愮偣绫诲埆
g_Grid[i][c1] .iID = GRID_BLANK;
g_Grid[i][c2] .iID = GRID_BLANK;
}
}
} // end for
// 涓嶉?br/> return FALSE;
}
else
{
return Match(r1, c2, r1, c1);
}
}
// 瀹林滑鍦ㄥ伣涓鍒楋纻
if(c1 == c2)
{
if(r1 <= r2)
{
if(GridsConnected(c1, r1, r2, FALSE))
{
OutputPath(r1, c1, r2, c1);
return TRUE;
}
// 鏄惁链绥叾浠栭氲矾锛?br/> for(int i = 0; i < COLS; i ++)
{
if(i == c1)
continue;
// 蹇呴』涓虹└镙?br/> if( GRID_BLANK == g_Grid[r1][i] .iID
&& GRID_BLANK == g_Grid[r2][i] .iID)
{
//灏嗕袱涓嫄镣圭殑绫诲埆璁剧疆涓篿ID锛出扐钖庡垽鏂槸钖︽湁璺缎
g_Grid[r1][i].iID = g_Grid[r2][i] .iID = iID;
if(GridsConnected(r1, i, c1)
&& GridsConnected(i, r1, r2, FALSE)
&& GridsConnected(r2, i, c1))
{
// OK, 杩桦师绫诲埆
g_Grid[r1][i].iID = GRID_BLANK;
g_Grid[r2][i].iID = GRID_BLANK;
OutputPath(r1, c1, r1, i);
OutputPath(r1, i, r2, i);
OutputPath(r2, i, r2, c1);
return TRUE;
}
else
{
// 涓嶉泛纴鍒欐祴璇曚笅涓鏉¤矾寰彻纴骞朵笖杩桦师鎷愮偣绫诲埆
g_Grid[r1][i].iID = GRID_BLANK;
g_Grid[r2][i].iID = GRID_BLANK;
}
}
}
// 涓嶉?br/> return FALSE;
}
else
{
return Match(r2, c1, r1, c1);
}
}
// 涓嶅渜钖屼竴鍒楁守钥呰
// 阃氲绷鍦ㄦ嫄镣规瀯阃豺拰鏂规牸绫诲埆燧稿伣镄勤楠镙碱纴铹跺悗鍒柇瀹林滑鏄惁镵旒泛纸链澶?鏉$嚎锛屾渶灏?涓浔
// 鍏朵腑涓鏉¢鍖栵级
for(int i = 0; i < ROWS; i ++)
{
// 鎷愮偣1蹇呴』涓虹└镙?br/> if(g_Grid[i][c1] .iID != GRID_BLANK)
continue;
// 璧风偣鍜屾嫄镣?镵旒氩悧锛?br/> g_Grid[i][c1] .iID = iID;
if(GridsConnected(c1, i, r1, FALSE))
{
// 鏄殑锛屾嫄镣?蹇呴』涓虹└镙?br/> if(g_Grid[i][c2] .iID != GRID_BLANK)
{
// 杩桦师鎷愮偣1镄动被鍒纴灏濊瘯涓嬩竴鏉¤矾寰?br/> g_Grid[i][c1] .iID = GRID_BLANK;
continue;
}
// 鎷愮偣2鍜屾嫄镣?镵旒氩悧锛?br/> g_Grid[i][c2] .iID = iID;
if(GridsConnected(i, c1, c2))
{
// 鏄殑锛出扐钖庡垽鏂嫄镣?鍜?r2, c2)鏄惁镵旒?br/> if(GridsConnected(c2, i, r2, FALSE))
{
// 鏄殑锛屻矾寰勤垒鍒帮纴杩桦师鎷愮偣绫诲埆
g_Grid[i][c2] .iID = GRID_BLANK;
g_Grid[i][c1] .iID = GRID_BLANK;
//
OutputPath(r1, c1, i, c1);
OutputPath(i, c1, i, c2);
OutputPath(i, c2, r2, c2);
return TRUE;
}
}
// 鎷愮偣2鍜屾嫄镣?涓嶉泛纴杩桦师鎷愮偣绫诲埆锛岸皾璇曚笅涓琛?br/> g_Grid[i][c1] .iID = GRID_BLANK;
g_Grid[i][c2] .iID = GRID_BLANK;
}
else
{
// 璧风偣鍜屾嫄镣?涓嶈仈阃泛纴杩桦师鎷愮偣绫诲埆
g_Grid[i][c1] .iID = GRID_BLANK;
}
} // end for
for(i = 0; i < COLS; i ++)
{
// 鎷愮偣1蹇呴』涓虹└镙?br/> if(g_Grid[r1][i] .iID != GRID_BLANK)
continue;
// 璧风偣鍜屾嫄镣?镵旒氩悧锛?br/> g_Grid[r1][i] .iID = iID;
if(GridsConnected(r1, i, c1))
{
// 鏄殑锛屾嫄镣? 蹇呴』涓虹└镙?br/> if(g_Grid[r2][i] .iID != GRID_BLANK)
{
// 杩桦师鎷愮偣1镄动被鍒纴灏濊瘯涓嬩竴鏉¤矾寰?br/> g_Grid[r1][i] .iID = GRID_BLANK;
continue;
}
// 鎷愮偣2鍜屾嫄镣?镵旒氩悧锛?br/> g_Grid[r2][i] .iID = iID;
if(GridsConnected(i, r1, r2, FALSE))
{
// 鏄殑锛出扐钖庡垽鏂嫄镣?鍜?r2, c2)鏄惁镵旒?br/> if(GridsConnected(r2, i, c2))
{
// 鏄殑锛屻矾寰勤垒鍒帮纴杩桦师鎷愮偣绫诲埆
g_Grid[r1][i] .iID = GRID_BLANK;
g_Grid[r2][i] .iID = GRID_BLANK;
//
OutputPath(r1, c1, r1, i);
OutputPath(r1, i, r2, i);
OutputPath(r2, i, r2, c2);
return TRUE;
}
}
// 鎷愮偣2鍜屾嫄镣?涓嶉泛纴杩桦师鎷愮偣绫诲埆锛岸皾璇曚笅涓琛?br/> g_Grid[r1][i] .iID = GRID_BLANK;
g_Grid[r2][i] .iID = GRID_BLANK;
}
else
{
// 璧风偣鍜屾嫄镣?涓嶉泛纴鍒栾缮铡熸嫄镣圭被鍒纴灏濊瘯涓嬩竴鏉¤矾寰?br/> g_Grid[r1][i] .iID = GRID_BLANK;
}
}
return FALSE;
}
// 妯℃嫙镣瑰向涓榧豹爣銆效疄闄呮粲鍐垫湁镣逛笉涓镙凤纴榧豹爣娌℃湁镣瑰向涓锛屻呖灏戠湅璧锋撒鏄伞镙枫备簨瀹炰芄鍙槸镣瑰向滨嗙涓娆★纴钖庝竴娆℃病链夌偣鍑汇傜敤SendInput哄涓镙枫?br/>void MouseClick(const CPoint& p1, const CPoint& p2)
{
// 灏骨鎴峰尯鍧愭爣杞崲涓哄睆骞曞潗镙?br/> CPoint pp1(p1), pp2(p2);
::ClientToScreen(g_hLLKWnd, &pp1);
::ClientToScreen(g_hLLKWnd, &pp2);
// 镣瑰向涓榧豹爣
/* */
::SetCursorPos(pp1 .x, pp1 .y);
mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(100);
::SetCursorPos(pp2 .x, pp2 .y);
mouse_event( MOUSEEVENTF_LEFTDOWN , 0, 0, 0, 0);
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
/*
INPUT clk;
ZeroMemory(&clk, sizeof(clk));
clk .type = INPUT_MOUSE;
clk . mi .dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
clk . mi .dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;
::SetCursorPos(pp1 .x, pp1 .y);
VERIFY(1 == SendInput(1, &clk, sizeof(clk)));
Sleep(300);
::SetCursorPos(pp2 .x, pp2 .y);
VERIFY(1 == SendInput(1, &clk, sizeof(clk)));
Sleep(300);
*/
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=370124