Assert 창, Debug 창을 자동으로 닫습니다.
============================================================================
일상적인 업무에서 디버깅의 편의를 위해 종종 프로젝트에 대량의 Assert를 도입한다. 이런 Assert의 장점은 말할 필요도 없지만 일부 Assert는 프로그램의 오류가 아니라 데이터의 문제일 수도 있다.
예를 들어 한 항목이 데이터베이스에서 데이터를 읽을 때 데이터가 정확하지 않으면 대량의 Assert 창이 나타날 수 있다. 그러나 이런 오류는 치명적이지 않을 수도 있다. 프로그램은 정상적으로 실행되고 다른 모듈의 Debug에도 영향을 주지 않을 것이다. 이때 우리는 수동으로 한 점을 무시하거나 키보드의 i키를 누르고 놓지 않고 모든 Assert 창이 모두 닫힐 때까지 해야 한다. 이렇게 하는 것은 시간이 많이 걸린다.개발 효율에 영향을 주다.
그래서 이런 짜증나는 창을 자동으로 닫는 프로그램을 만들 수 있을까?
나의 해결 방법은 Spy++를 사용하여 창의 클래스 이름을 찾은 다음 순환에서FindWindow () 창을 찾은 다음 창의 무시 단추에 클릭 메시지를 보내는 것입니다.매번 순환이 끝날 때마다 반드시 Sleep을 한 번 해야 한다. Sleep의 시간은 개인의 수요를 보면 나는 100ms에 한 번이다.
void IgnoreAssert()
{
HWND hWnd = NULL;
HWND hIgnore = NULL;
while(true)
{
//ASSERT Dialog
hWnd = ::FindWindow("#32770", "Microsoft Visual C++ Debug Library");
if(!hWnd)
hWnd = ::FindWindow("#32770", "Microsoft Visual C++ Runtime Library");
if (hWnd)
{
hIgnore = ::GetDlgItem(hWnd, 5/* */);
if(hIgnore)
::SendMessage(hIgnore, BM_CLICK, NULL, NULL);
}
//Client MessageBox
hWnd = ::FindWindow("#32770", "Error");
if (hWnd)
{
hIgnore = ::GetDlgItem(hWnd, 5/* */);
if(hIgnore)
::SendMessage(hIgnore, BM_CLICK, NULL, NULL);
}
::Sleep(100);
}
}
위의 #32770은 Windows Dialog의 클래스 이름으로Spy++를 통해 얻을 수 있으며 사실 이것은NULL을 채워도 찾을 수 있습니다.
그리고 질문 하나 더,'무시'버튼의 ID가 5인 걸 어떻게 찾았을까요?
다음과 같습니다.
hWnd = ::FindWindow("#32770", "Test MessageBox");
char szName[1024] = {0};
for (int i= 0; i < 100; i++)
{
::GetDlgItemText(hWnd, i, szName, 1024);
int b = 0;
}
int b = 0;이 줄의 다음 단점은 뛰어가면 곧 찾을 수 있다.
마지막으로 우리는 테스트 프로그램을 써서 이 프로그램의 기능을 시험해 볼 수 있다.
int _tmain(int argc, _TCHAR* argv[])
{
while(true)
{
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
_ASSERT(0);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
::MessageBox(NULL, _T("Test MessageBox"), _T("Error"), MB_ABORTRETRYIGNORE);
Sleep(5000);
}
return 0;
}
물론 좀 더 통용적으로 하려면 프로필을 작성해서 더 많은 창을 닫는 것을 지원할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.