ข้ามไปที่เนื้อหาหลัก

Console(DOS) ก็มี Handle ได้นะ

เนื่องจาก function บางฟังก์ชั่นบนวินโดว์ต้องการตัวแปร HWND หรือ Handle ของวินโดว์ไปใช้งาน
เช่น GetDC, หรืออาจจะเป็นฟังก์ชั่นพวก WinProc หรือฟังก์ชั่นจัดการกับ message นั่นเอง
แต่.... เราเขียนโปรแกรมแบบ console จะมี Handle ได้อย่างไร

วิธีการมีง่ายๆ เพียง 4-5 ขั้นตอนเท่านั้น
  1. เรียกใช้ฟังก์ชั่น GetConsoleTitle() เพื่อเก็บค่าของ Title ของวินโดว์ปัจจุบันไว้
  2. เรียกฟังก์ชั่น SetConsoleTitle() เพื่อเปลี่ยน Title ของ console ที่เราต้องการ
  3. ให้มัน delay 40 มิลลิวินาที โดยใช้ฟังก์ชั่น Sleep(40) เพื่อให้แน่ใจว่า title ของ โปรแกรมเรา update แล้ว
  4. เรียกใช้ฟังก์ชั่น FindWindow(NULL, uniquetitle) ฟังก์ชั่นนี้ถือว่าเป็นฟังก์ชั่นหลักเลยทีเดียว เพื่อจะนำค่า HWND ของ โปรแกรมแบบ console หรือแบบ Win32 มา ค่าที่ retune กลัมาจะเป็น HWND หรือ NULL ในกรณีที่มันเกิดการผิดพลาดขึ้น เช่นหาโปรแกรมที่มี Title ตามที่เราต้องการไม่เจอ
  5. เรียกฟังก์ชั่น SetConsoleTitle() เซ็ทค่าที่ได้จากขั้นตอนที่ 1 ให้มันเหมือนเดิม หรือจะไม่เซ็ทกลับก็ได้
ตัวอย่างโค้ดพร้อม Comment


#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

    //This main function is correctly by standard C
    //**returned int not void**
int main(int argc, char *argv[])
{
    //Declare Variable
    char windowTitle[1024], pszOldTitle[1024], pszNewTitle[1024];
    //Step 1
    GetConsoleTitle(pszOldTitle, sizeof(pszOldTitle));
    cout <<
"Old Title: " << pszOldTitle << endl; //To test if it captured or not
    //We use GetTickCount() and GetCurrentProcessId() for new Title
    //it's could be something else you can thinking of such as your name or whatever
    //sprinf() to copy value to pszNewTitle which is a char
    sprintf(pszNewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
    //Step 2
        //We use SetConsoleTitle() to specified the new Title name for our console
    //By passing a char variable (pszNewTitle) which is gived a named
    SetConsoleTitle(pszNewTitle);
    //Step 3
    //Make it sleep or delay by 40 milliseconds
    Sleep(40);
    //This is a debug to see if new title is set or not
    //We use pszNewTitle as the same because of it's not use anymore
    //and it could save a little memory but it's not actually good way
    GetConsoleTitle(pszNewTitle, sizeof(pszNewTitle));
cout <<
"New Title: " << pszNewTitle << endl;
    //Step 4
    // This is the time you will get what you want Console window handle
    //To Specified the title value of the window that you want to get a handle
    //in the second parameters
    HWND consoleHwnd = FindWindow(NULL, pszNewTitle);
    //GetWindowText() function to test the handle we got is that we want or not
    //by compare with the pszNewTitle ot by calling GetConsoleTitle() function
    GetWindowText(consoleHwnd, windowTitle, sizeof(windowTitle));
cout <<
"Window Title: " << windowTitle << endl;
    //This is in <stdlib.h> for paused console to see the value
    //if it's not called the console will terminate(Close) immediately
    system("PAUSE");
    //This MACRO or constance set as 0 for success without error
    //or you can return 0
    return EXIT_SUCCESS;
}



โค้ดโปรแกรมหลังจากตัด Comment แล้ว


#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
    char windowTitle[1024], pszOldTitle[1024], pszNewTitle[1024];
    GetConsoleTitle(pszOldTitle,
sizeof(pszOldTitle));
    cout <<
"Old Title: " << pszOldTitle << endl;
    sprintf(pszNewTitle,
"%d/%d", GetTickCount(), GetCurrentProcessId());
    SetConsoleTitle(pszNewTitle);
    Sleep(
40);
    GetConsoleTitle(pszNewTitle,
sizeof(pszNewTitle));
    cout <<
"New Title: " << pszNewTitle << endl;
    HWND consoleHwnd = FindWindow(NULL, pszNewTitle);
    GetWindowText(consoleHwnd, windowTitle,
sizeof(windowTitle));
    cout <<
"Window Title: " << windowTitle << endl;
    system(
"PAUSE");
    return     EXIT_SUCCESS;
}




Code ข้างบนนำมาจากการ Export to HTML ของ Dev-C++

แล้วผมไม่ได้ทำ ขั้นตอนที่ 5 นะครับ เพราะ่เห็นว่าได้ผลตามที่ต้องการแล้ว

รูปจากการรันครับ


หากมีข้อผิดพลาดประการใด แนะนำและติชมได้เลยครับ

ที่มา: Microsoft

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

หมดหวังกับรายการทีวีในประเทศไทย

ไม่ได้เขียน Blog มานานสกิลด้านเขียนไม่รู้จะยังดีเหมือนเดิมมั้ยนะครับ (หัวข้อก็จะ clickbait  ตามแนว Content ยุคใหม่) จริงๆ แล้ว คิดจะเขียนมาตั้งนานแล้วแต่ไม่รู้จะเขียนอะไร พอดีวันนี้อ่านเจอโพสต์ของเพื่อนในเฟสบุ๊คที่แชร์มา หัวข้อประมาณว่า ประเทศไทยมีความพยายามทำให้คนโง่ลง คือผมก็ติดตามข่าวมาเรื่อยๆ ช่วงไปอยู่จีนก็ยังติดตามอยู่ แต่มีความรู้สึกว่าข่าวของประเทศเรากับประเทศจีนนี่คือคนละขั้วเลย ที่จีนข่าวส่วนใหญ่จะเป็นข่าวที่ค่อนข้างมีสาระ และไม่มีข่าวงมงาย น่าจะเนื่องมาจากกฎหมายของประเทศไทยที่ค่อนข้างคุมเข้มกับสื่อ ย้อนกลับมาที่ไทย ประเทศเราไม่มีกฎหมายคุมเข้มสื่อเหมือนประเทศจีนขนาดนั้น สื่อประเทศเราค่อนข้างมีอิสระในการนำเสนอ แต่หลังๆ มานี่ผมเห็นแต่ข่าวอาชญากรรม หรือข่าวให้หวยซะส่วนใหญ่ ก็เข้าใจว่าต้องการยอดผู้ชม แต่การที่สื่อนำเสนอแบบนั้นนี่ไม่แน่ใจว่าจะดีต่ออนาคตประเทศชาติหรือไม่นะครับ คนดูข่าวเพื่อจะรอเลขเอาไปซื้อหวย ไม่แน่ใจว่าสนใจอะไรมากกว่าระหว่างหวยกับข่าว ตอนจะมีกฎหมายหวยออนไลน์ก็เห็นออกมาต่อต้านบอกมอมเมาประชาชน แต่สิ่งที่สื่อกำลังนำเสนออยู่นั้นมันย้อนแย้งในตัวเองชอบกล...

Alfresco from source

การติดตั้ง Alfresco นั้นมีหลายวิธีด้วยกัน ผมขอแยกเป็นสามกรณีดังนี้ ติดตั้งจากตัว Installer ซึ่งวิธีนี้ถือว่าสะดวกที่สุดครับ เนื่องจากตัว Alfresco นั้นเตรียมเครื่องมือที่จำเป็นไว้ให้เกือบหมดแล้ว (บน Windows นี่ถือว่าพร้อมกับการทำงานทีเดียว ส่วนบน Unix จะต้องติดตั้ง MySQL ,Swf2PDF ImageMagick และ OOo - OpenOffice เองครับ เนื่องจากไม่สามารถรันได้แบบวินโดว์) ติดตั้งจากตัว Compiled Binary ซึ่งจะเป็นไฟล์ zip หรือ tarball ตามแต่ระบบปฏิบัติการ วิธีสุดท้ายเป็นวิธีที่ผมจะนำเสนอในตอนนี้คือการ Compile Source จาก SVN ครับ สองวิธีสุดท้ายนี้เราจำเป็นต้องหาพวก binary ของ third party มาลงเอง (แต่สำหรับ linux ไม่ว่าจะวิธีไหนเราก็ต้องหามาลงเองครับ) เราสามารถ Check out Source จาก repository จาก Alfresco ได้หลายวิธีไม่ว่าจะ Check out จาก Eclipse โดยผ่าน Subclipse หรือ Netbeans หรือแม้กระทั่ง SVN command line ก็สามารถทำได้ ในที่นี้ผมจะขอเลือกใช้แบบ Command line ซึ่งเป็นวิธีที่สะดวกที่สุด เพราะมีมาให้กับ linux อยู่แล้วหรือหากใครใช้ Windows อยู่ ผมขอแนะนำให้ติดตั้ง SlikSVN 1.5.x เนื่องจากขั้นตอน build นั้นจำ...

Alfresco กับ XForm

XForm นั้นเป็น Specification ที่น่าจะกลายเป็นมาตรฐานในอนาคตเนื่องจากเว็บต่างจำเป็นต้องใช้ Form ในการติดต่อกับผู้ใช้เป็นส่วนใหญ่ ส่วนตัว implement นั้นมีหลายตัวด้วยกันไว้ผมจะเอามาบอกในบทความต่อๆ ไป แต่คราวนี้เรามาดูใน Alfresco กันครับ ใน Version 3.2 นั้น Alfresco ได้เลือก Chiba ในเป็น Engine ในการจัดการกับ XForm ครับ แต่ก็นั่นแหละครับทำให้เราจำเป็นต้องลง virtual tomcat สำหรับรัน WCM (virtual tomcat คือ tomcat อีกตัวไว้สำหรับทำหน้าที่ติดต่อกับ user โดยทั่วไป หรือเรียกว่าเอาไว้เป็นหน้าด่านว่าเอกสารอะไรที่เราต้องการเผยแพร่เราก็สามารถ publish ไปยัง WCM ได้) ตอนนี้ orbeon (เป็น XForm engine อีกตัว) สามารถทำการเชื่อมต่อกับ Alfresco ได้แล้วต่อไปถ้าเราจะสร้าง XForm คงง่ายขึ้นเป็นกองเพราะ orbeon เป็น XForm server ที่ไว้สร้าง Form แบบ virtual เลย(ลากแปะๆ แนะนำให้ลองเข้าไปเล่น demo ของ orbeon ดูครับ น่าเล่นมาก) แต่ตัวนี้ผมยังไม่ได้ลองทำดูนะครับ พอดีค้นหาเจอเลยนำมาลง blog ไว้ก่อน ไว้ถ้าทดสอบแล้วได้ความว่าอย่างไรจะมารายงานอีกรอบ