[toc]

C语言获取窗口句柄

1.C语言获取控制台程序的句柄

  • 完整代码功能为获取控制台程序的窗口句柄并在窗口用TextOutW写句话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <windows.h>
#include <conio.h>
#include <tchar.h>

int main(int argc, char** argv) {

TCHAR title[256];//控制台程序标题
//获取控制台标题
GetConsoleTitleW(title, 256);
HWND hwnd1 = FindWindowW(0, title);
HWND hwnd2 = FindWindowW(L"ConsoleWindowClass", 0);
HWND hwnd3 = GetConsoleWindow();
HWND hwnd4 = GetForegroundWindow();
HWND hwnd = hwnd1;
HDC hdc = GetDC(hwnd);

while (TRUE)
{
TextOutW(hdc, 10, 10, L"Hello, Windows!", 15);
Sleep(100);//延时100ms
if (_getch() == 0x1b)//若按下ESC键跳出循环
{
break;
}
}
ReleaseDC(hwnd, hdc);
return 0;
}

2.C语言获取其他程序的窗口句柄

  • 完整代码功能为获取Notepad的窗口句柄并在窗口用TextOutW写句话
  • vs2022中的spy工具可以查看窗口类名与标题名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <conio.h>
#include <tchar.h>

int main(int argc, char** argv)
{
//Notepad为ClassName,Untitled - Notepad为Caption
HWND hwnd = FindWindowW(L"Notepad", L"Untitled - Notepad");
HDC hdc = GetDC(hwnd);

while (TRUE)
{
TextOutW(hdc, 10, 10, L"Hello, Windows!", 15);
Sleep(100);//延时100ms
if (_getch() == 0x1b)//若按下ESC键跳出循环
{
break;
}
}
ReleaseDC(hwnd, hdc);
return 0;
}

3.C语言根据窗口句柄获得进程句柄

  • 完整代码功能为获取Notepad的进程句柄后,根据句柄结束notepad的进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
#include <stdio.h>

int main(int argc, char** argv)
{
HWND hWnd = FindWindowW(L"Notepad", L"Untitled - Notepad");
printf("Window Handle is :0x%X\n", hWnd);
//获取进程的ID
DWORD pid;
GetWindowThreadProcessId(hWnd, &pid);
printf("ProcessId is:%d\n", pid);
//获取进程的句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
printf("Process Handle is: 0x%X\n", hProcess);
//根据进程句柄结束进程
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
return 0;
}